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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY