zhangshaoye 2015-10-13 14:29 采纳率: 0%
浏览 1759

关于java内存垃圾回收的一点疑问

class test{

void m(){
Object obj[]=new Object[1];
 Object o = new Object();
 obj[0]=o;
o = null;//用不着
}
}
很常见的一个例子,说最后Object对象都没有被释放,因为obj[0]还引用这个对象。
我的疑问是,既然局部变量在方法运行完,引用会被销毁,也就是说o不用被置为null,也会堆内存的Object对象也会被回收(符合回收的条件,不一定立即GC),那同理,obj这个局部变量应该也会被销毁,它指向的堆里的Object也会被回收(符合回收的条件,不一定立即GC),这样就不会再引用到Object对象了,按理说最后Object对象应该符合被GC的条件的啊?

我知道GC可能不是立即执行!我想知道的是,是否符合被GC的条件!

望高人解答,我实在没金币了,见谅

  • 写回答

3条回答

  • 落寞红尘 2015-10-13 15:19
    关注

    GC时会对活动对象进行标记,没有被标记的对象就是垃圾对象,但垃圾对象不会直接被清除,垃圾收集器还会判断是否需要执行对象的finalize方法,如果对象没有覆写finalize方法或它的finalize已经被执行过一次,那么是没有必要执行的,否则就认为是有必要执行的,当被判断为有必要执行时,这个对象会被放入一个F-Queue队列中,由一个后台的低优先级的Finalizer线程执行队列中的对象的finalize方法,对象可以在这个方法中中复活自己,即重新被其他对象引用,但这个函数只会被垃圾收集器运行一下,第二次回收这个对象时这个函数不会再被调用。稍后GC会对F-Queue队列中的对象执行第二次标记。要了解更详细的话可以参考这篇文章:JAVA中的垃圾回收机制

    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?