Java里将对象设置为null,是否会被立刻回收?

不会,设置为 null 只是栈中指向的引用为 null,但是 new 出来的对象还是存在于堆里面的,按照目前的 GC 算法,要等 survior1 or survior2 满的时候 JVM 才会调用 GC 命令清除对应 survior 区的对象,将没有栈指向的对象给回收掉。所以回收内存不是实时的,要看 survior 区的大小和应用中创建对象的速度来看。

所以,可以认为用完的变量设为 null 有助于 java 的 gc 更早的将无用的内存收回,仅此而已。

一个对象置为null,并不会被立刻回收,还需要进行finalize()方法。但是只能逃脱一次。
​ 对象在正式宣告死亡,被回收前通常会经历两次标记的过程(引自:《深入理解Java虚拟机》):

当对象与GC root无相连的引用链后,会被第一次标记,然后会进行筛选,筛选条件为该对象是否有必要执行finalize()方法。如果对象没有覆盖finalize()或者finalize()已经被虚拟机调用了,则以上两种情况下都会定为没有必要执行。

当对象被判定为有必要执行finalize()方法时,对象会被放置于F-Queue队列里,然后会有虚拟机自动建立的,低调度优先级的Finalizer线程去执行finalize()方法。finalize()方法是对象逃脱死亡的最后一次机会,稍后收集器将会对队列里的对象进行第二次小规模标记,二次标记后将会被回收。

pg: finalize()方法只会被系统自动调用一次,如果面临下一次回收,他的finalize()将不会执行,即无法自救!
————————————————
版权声明:本文为CSDN博主「不吃鱼的jobs」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40270014/article/details/122219014

posted @ 2023-06-27 00:02  huigui_mint  阅读(766)  评论(0编辑  收藏  举报