Object obj = new Object();
obj被存放在栈中,new Object();被存放在堆中,obj是new Object();的引用变量,对不对?
网上说在没有引用变量指向对象或数组之后,堆才会释放内存,什么情况才是没有引用变量指向对象或数组?
谢谢解答……
obj被存放在栈中,new Object();被存放在堆中,obj是new Object();的引用变量,对不对?
网上说在没有引用变量指向对象或数组之后,堆才会释放内存,什么情况才是没有引用变量指向对象或数组?
谢谢解答……
Object obj1 = new Object();
Object obj2 = obj1;
Object obj3 = obj2;其他引用等;当obj1、obj2、obj3生命周期结束了;
obj1 = null;
obj2 = null;
obj3 = null;等等栈中所有的变量这里是obj1、obj2、obj3,都没有堆中对象地址的引用,即new Object()的地址引用。
什么时候obj1、obj2、obj3生命周期才会结束
1、可触及状态;2、可复活状态;3、不可触及状态;
当一个对象处于不可触及的状态时,垃圾回收器(GC)才会真正回收它占用的内存
// 可触及状态
Object obj = new Object();
// 对象不再被引用,可复活状态
// 在这个状态下,GC会准备释放它占用的内存,在释放之前,会调用它及其他处于可复活状态的对象的
// finalize()方法,这些finalize()方法有可能使对象重新转到可触及状态
obj = null;
// 当Java VM 执行完所有可复活对象的finalize()方法后,假如这些方法都没有使对象转到可触及状态,那么对象就进入不可触及状态。这是GC才会真正回收它占用的空间
可以认为,当obj被赋予另外的值的时候,原指向new Object()的引用变量消失。
垃圾回收器在检查的时候就会清缓存!???不知道这么理解对不对