题目:
jvm内存回收机制之对象的内存状态
分析:
根据被变量引用过程,分为三种状态:可达状态、可恢复状态和不可达状态
解答:
这三种状态的转换是对象在内存整个生命周期中所经历的三个阶段。
可达状态:对象创建之后,有一个以上的变量引用该对象。如果像
new Test();
这样的就很没有变量引用,创建之后就转到可恢复状态了;
可恢复状态: 程序中没有任何变量引用它就直接进入该状态,如
Test test = new Test();
test = null;
执行到null后,就没有变量引用Test对象了,这个状态就是可恢复状态。如果系统此时运行垃圾回收程序准备回收,在此之前先调用该对象的finalize()方法。如果通过finalize()方法后也没有变量引用到该对象,那么状态转向不可达状态。如果重新获得了引用,则转向可达状态。
不可达状态:内存回收执行后会直接回收该对象内存,对象的生命周期结束。
上图是引用的博客中的图片。
补充:
finalize()方法是java.lang.Object对象方法。jdk上这样描述该方法“ 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。”
有一点需要注意,对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。也就是说如果在调用一次只后,恢复到可达状态,那么java虚拟机将不会再次调用finalize()方法。这点有点奇怪,对此留下进一步思考的余地。