JAVA对象的生命周期 (一)
最近一直在折磨着学习的事情。无聊间看到了手头上的“高质量代码”这本书。其实以前也一直在看。只是断断续续,没有坚持finish它。
关于JAVA的最大的一个误解,就是垃圾收集器可以防止任何内存泄漏。不幸的是,这知识一个美丽的传说。然而,既然JAVA拥有垃圾收集器,为什么还会有内存泄漏呢?
1 JAVA对象的生命周期
在一般情况下,如下图:
1 |
2 5 4 3 2 创建 活跃 不可达 已收集 最终化 已回收 隐形
2.垃圾收集
3.在finalize () 创建新的强引用
4.对象包含可执行的finalize ()
5.对象不包含可执行的finalize ()
对象刚刚创建时,都处于创建状态。JVM会为对象分配空间,调用对象的构造函数。当对象被某个变量引用后,就进入活跃状态,或者称为强可达状态。当垃圾收集发生时,垃圾收集器从一组根引用开始试图遍历所有的对象,如果对象可以被遍历到,则为可达状态。
处于强可达状态的对象,可能进入隐形状态。隐形的对象是内存泄漏的来源之一。
如果没有任何强引用指向对象,对象就进入不可达状态,不可达状态的对象将在下一次垃圾收集发生时被标记为可以收集,这时对象进入已收集状态。
在已收集对象中,当对象的finalize()方法被调用后,仍然没有强引用指向对象,那么对象就会进入最终化状态。如果在finalize()方法中生成了新的强引用指向对象,那么对象就回到可达状态,此时,对象被复活了。
而对象不包含可执行的finalize()方法,意思是对象未提供此方法或者被申明为private,或者对于已经被复活的对象此方法已经执行过一次。
最终化状态下的对象将会被垃圾收集器真正收回其内存。
上面提到了强可达状态。引用对象针对强引用可分为:
强可达状态
弱可达状态
软可达状态
1.1 强可达状态官方文档中描述为:
An object is spanly reachable if it can be reached by some thread without traversing reference objects. A newly –created object is span reached by the thread that create it.
Such as:
public class ObjectA {
public ObjectA() {
super();
objectB = new ObjectB ();
}
private ObjectB objectB;
}
public class ObjectB {
public ObjectB() {
super();
0bjectC = new ObjectB ();
}
private ObjectC objectC;
}
我们可以知道ObjectA 到ObjectB 是一个强可达。也就是说当创建对象ObjectA时,构造函数中初始化了ObjectB的引用,此时ObjectB出于强可达状态。
1.2 软可达状态
An object is softly reachable if it is not spanly reachable but can be reached by traversing a soft reference.
1.3 弱可达状态
An object is weakly reachable if it is neither span nor softly reachable but can be reached by traversing a weak reference.
待续。。。
以上是 JAVA对象的生命周期 (一) 的全部内容, 来源链接: utcz.com/z/393306.html