问题描述
- 关于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的条件!
望高人解答,我实在没金币了,见谅
解决方案
Java内存与垃圾回收调优
Java内存与垃圾回收调优
Java内存与垃圾回收调优
解决方案二:
GC时会对活动对象进行标记,没有被标记的对象就是垃圾对象,但垃圾对象不会直接被清除,垃圾收集器还会判断是否需要执行对象的finalize方法,如果对象没有覆写finalize方法或它的finalize已经被执行过一次,那么是没有必要执行的,否则就认为是有必要执行的,当被判断为有必要执行时,这个对象会被放入一个F-Queue队列中,由一个后台的低优先级的Finalizer线程执行队列中的对象的finalize方法,对象可以在这个方法中中复活自己,即重新被其他对象引用,但这个函数只会被垃圾收集器运行一下,第二次回收这个对象时这个函数不会再被调用。稍后GC会对F-Queue队列中的对象执行第二次标记。要了解更详细的话可以参考这篇文章:JAVA中的垃圾回收机制
解决方案三:
jvm的不同版本采取的垃圾收集方式不同,判断是不是应该标记为垃圾的方式也不同,还有即使是垃圾也不一定会清除。具体的可以看看深入理解jvm
解决方案四:
谢谢各位好心人,可能我没表达清楚,我换个问法:
方法执行完毕后,是否还有引用指向Object对象,从而是Object对象符合条件被GC,当然,可能不是立即就被GC。
我的理解,v也是局部变量,方法执行完后,也会被销毁,这样到最后,是没有引用指向Object对象的