首页 > 试题广场 >

下面有关java的引用类型,说法正确的有?

[不定项选择题]
下面有关java的引用类型,说法正确的有?
  • 被GCroot强引用=Gcroot对象来说,只要有强引用的存在,它就会一直存在于内存中
  • 如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
  • 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存
  • 一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的空间
发现这道题完全没头绪,就去查了一下,感觉说的比较清楚了。
四种引用类型
JDK1.2 之前,一个对象只有“已被引用”和"未被引用"两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对象。
所以在 JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。
一,强引用
Object obj = new Object(); //只要obj还指向Object对象,Object对象就不会被回收 obj = null; //手动置null
只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了
二,软引用
软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。
在 JDK1.2 之后,用java.lang.ref.SoftReference类来表示软引用。
三,弱引用
弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2 之后,用 java.lang.ref.WeakReference 来表示弱引用。
四,虚引用
虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,在 JDK1.2 之后,用 PhantomReference 类来表示,通过查看这个类的源码,发现它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,也就是说将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用。
发表于 2019-08-15 20:16:51 回复(43)
1、强引用:一个对象赋给一个引用就是强引用,比如new一个对象,一个对象被赋值一个对象。
2、软引用:用SoftReference类实现,一般不会轻易回收,只有内存不够才会回收。
3、弱引用:用WeekReference类实现,一旦垃圾回收已启动,就会回收。
4、虚引用:不能单独存在,必须和引用队列联合使用。主要作用是跟踪对象被回收的状态。
发表于 2019-07-22 19:43:14 回复(12)
凯头像
1.强引用 ,  例如   Object  a=  new Object();只要存在强引用 ,则不能回收。
2.弱引用 , 在内存不够时回收。
3.虚引用,只能存活到一下次垃圾回收。
4.影子引用 ,  只是在回收时触发一个事件。
发表于 2014-12-20 10:24:41 回复(2)
强软弱虚
强:不会被回收
软:空间不足被回收
弱:发现就回收
虚:形同虚设,随时可能被回收
发表于 2022-02-26 22:15:21 回复(0)
A选项有疑问啊,至于那种循环引用问题,不是按照现在的垃圾收集器也会进行回收嘛。
发表于 2019-09-09 16:28:09 回复(12)
发表于 2019-07-20 09:39:15 回复(1)
  1. 强引用

使用最普遍的引用,也是我们日常使用的大多数引用。若一个对象具有强引用,就 相当于生活中必备的物品,垃圾回收器绝对不会回收它,当内存空间不足时,JVM 宁愿抛出 OOM 错误,也不回随意回收具有强引用的对象来解决内存不足问题。

  1. 软引用

若一个对象只具有软引用,则 相当于生活中可有可无的物品。若内存空间充足,则垃圾回收器不会回收它,一旦内存空间不足,则会回收这些对象的内存。只要垃圾回收器未回收这个对象的内存,则该对象能够被程序使用,通过使用软引用可以实现内存敏感的告诉缓存,加速 JVM 对垃圾内存的回收速度,同时维护系统的运行安全,防止 OOM 等问题的产生

  1. 弱引用

一若个对象只具有弱引用,则 相当于生活中可有可无的物品。 软引用和弱引用的区别在于:只拥有弱引用的对象具有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现具有弱引用的对象,则无论当前内存空间是否充足,都会回收它的内存。 但一般垃圾回收器的线程优先级很低,因此不会很快就回收具有弱引用的对象。

此外 软引用和弱引用都可以和一个引用队列联合使用,一旦他们所引用的对象被垃圾回收,JVM 就会将这个引用加入到相关的引用队列中。

  1. 虚引用

形同虚设的一个引用,不会决定对象的声明周期,一个对象持有虚引用,则任何时候都可能被垃圾回收器回收,主要用来跟踪对象被垃圾回收的活动

虚引用与软引用和弱引用的区别虚引用必须和引用对象联合使用。当来及回收器准备回收一个对象时,若发现该对象具有弱引用,则会在回收该对象的内存前,将该虚引用加入到与之关联的引用队列中。程序能够通过判断引用队列中是否已经加入虚引用,来了解被引用的对象是否将要被垃圾回收器回收。

发表于 2020-08-16 16:57:37 回复(0)
1.强引用(默认): 在Java中,最常见的就是强引用。把一个对象赋给一个引用变量,这个引用变量就是一个强引用。对于强引用的对象,就算出现了OOM也不会对该对象进行回收,这也是造成Java内存泄漏的主要原因之一。
2.软引用: 相对于强引用弱化了一些的引用,使用java.lang.ref.SoftReference类来实现。内存够用就保留,内存不够就回收。常用于对内存敏感的程序中,如高速缓存。
3.弱引用: 比软引用的生存期更短,使用java.lang.ref.WeakReference类来实现。只要垃圾回收机制一执行,不管JVM的内存空间是否够用,都会回收该对象占用的内存。
    3.1 软引用和弱引用的适用场景:取大量本地图片时,每次都从硬盘读影响性能,一次加载到内存又可能导致内存溢出,此时就可以使用软引用或弱引用来创建对象。
    3.2 使用WeakHashMap<>创建一个集合对象时,当程序调用System.gc()后,集合中存储的元素个数变为0。用于在高速缓存中存储对象,能够降低系统OOM的风险。
4.虚引用: 和没有任何引用一样,在任何时候都有可能被垃圾回收器回收,使用java.lang.ref.PhantomReference类来实现,必须和引用队列(ReferenceQueue)联合使用。主要作用是跟踪对象被垃圾回收的状态。
    4.1 引用队列(ReferenceQueue)和Reference类都继承了Object类,而软引用、弱引用、虚引用又都继承了强引用(Reference)。
    4.2 创建引用的时候可以指定关联的队列,当GC释放对象内存的时候,会将引用加入到引用队列。我们可以在所引用的对象内存被回收之前采取必要的行动,这相当于一种通知机制。

总结:个人觉得这道题选BC,首先对于A选项来说,我们常用的以new的方式创建一个对象就是强引用,如果真的一直存在内存中,虚拟机早就爆了。而对于D来说,就算是弱引用的对象,只有进行一次垃圾回收才会将其空间回收(不管内存足够与否),而不是选项中的那样,人家引用的好好的你就突然给回收了,找谁说理呢?
发表于 2020-06-10 20:42:41 回复(0)
发表于 2020-02-09 09:55:33 回复(0)
什么是强引用?什么是弱引用?
发表于 2019-07-20 09:14:12 回复(1)
强引用 : 只要有强引用,垃圾回收器就不会回收
软引用: 如果垃圾收集器空间够就回收,不够就不回收
弱引用:无论空间够不够 都回收
虚引用: 也叫幽灵引用,跟没有没什么区别,存在的目的只是为了做个标识

发表于 2021-09-28 17:13:50 回复(0)
强:不会被回收 软:空间不足被回收 弱:发现就回收 虚:形同虚设,随时可能被回收
发表于 2022-05-08 11:36:40 回复(0)
Java 中都有哪些引用类型?
    强引用:发生 gc 的时候不会被回收。
    软引用:有用但不是必须的对象,在发生内存溢出之前会被回收。
    弱引用:有用但不是必须的对象,在下一次GC时会被回收。
    虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用PhantomReference 实现虚引用,虚引用的用途是在 gc 时返回一个通知。
发表于 2022-01-29 12:05:30 回复(0)
A绝对有问题,借用<<深入理解java虚拟机>>里的一句话"当前主流的商用程序语言(java,C#)的内存管理子系统都是通过可达性分析算法来确定对象是否存活的",根可达算法的一大优点就是其解决了"引用计数"算法中难以处理循环引用的问题,对于A选项,如果即使存在强引用类型的循环引用,如果和GC Roots没有引用链相连,也会被垃圾回收器当成垃圾回收.
发表于 2021-07-28 22:44:52 回复(6)
其实严格来说,弱引用也能在内存有空间的时候被回收(内存紧张的情况下)。内存紧张时(比如即将发生内存溢出),在下次gc时就会回收弱引用(此时来看内存空间还有一点点)
发表于 2020-07-18 15:14:21 回复(0)
强:会一直存在于内存中,不会回收,直至oom
软:内存足够不回收,内存不够回收
弱:jvm回收的时候就会回收
虚:跟没有一样

发表于 2021-03-21 09:51:21 回复(0)

`
强引用(Strong Reference)是我们最常见的普通对象引用,只要还有强引用指向一个对象,就代表这个对象活着,那么这个对象就不会被垃圾收集器回收。如果没有其他的引用,只要超过了引用的作用域或显示的将(强)引用赋为null,就是可以被垃圾回收的了。
软引用(Soft Reference)是一种相对强引用弱化一些的引用,可以让对象豁免一些垃圾回收,只有当JVM认为内存不足时,才会去试图回收软引用指向的对象。JVM会确保在抛出OutOfMemoryError之前,清理软引用指向的对象。软引用通常来实现内存敏感的缓存,如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。
弱引用(Weak Reference)并不能使对象豁免垃圾收集,仅仅是提供一种访问在弱引用状态下对象的途径。这就可以用来构建一种没有特定约束的关系。比如,维护一种非强制性的映射关系,如果试图获取时对象还在,就使用它,否则重现实例化。它同样是很多缓存实现的选择。
幻像引用(虚引用),你不能通过它访问对象。虚引用仅仅是提供了一种确保对象被finalize以后,做某些事情的机制,例如,通常用来做所谓的post-mortem清理机制。

编辑于 2020-09-18 15:58:40 回复(0)
强引用  只要存在强引用  就不会被强制回收
弱引用  只要内存不足时   就会被回收
虚引用   不能单独存在  只能存活到下一次垃圾回收
影子引用  只是在回收时触发一个事件
发表于 2019-07-31 19:30:19 回复(0)
虚引用,一个对象是否有虚引用的存在,完全不影响其生存构造影响。也无法通过一个虚引用来取得一个对象实例
发表于 2016-05-16 09:33:18 回复(0)