java 强引用的对象什么时候回收?

时间:2024-04-11 14:30:45

关于强引用,大家都知道这么一段话:

强引用就是指在程序代码之中普遍存在的引用,如果一个对象具有强引用,那么JVM必定不会回收这个强引用的对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象

那么就有一个问题,Object obj=new Object(),obj作为强引用存在虚拟机栈中,而new Object()作为对象存在于堆中,当obj的作用域结束,对应的虚拟机栈消失,obj引用也同时消失,但new Object()对象却仍然存在于堆中,“JVM必定不会回收这个对象” ,那jvm不是很容易就OOM了吗?

显然,我们可以手动设置obj=null,这样gc就会主动地将new Object()对象回收,而这样肯定是太繁琐了。

实际上,这句话缺少了一个前提,就是这个对象要和强引用还有关联,也就是在根搜索算法中,还和GC Roots相连接,这样jvm就一定不会回收强引用的对象。上述的例子中,obj强引用消失后,new Object()和它的关联也就断了,这样就不再和GC Roots相连接,gc在之后的某个时间就会回收这个对象了。
java 强引用的对象什么时候回收?