JAVA对象的生命周期 (一)

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

回到顶部