[关闭]
@wangwangheng 2015-09-10T14:52:43.000000Z 字数 879 阅读 2275

Java对象的生命周期

Java


1. 创建阶段(Created)

2. 应用阶段(In Use)

对象至少被一个强引用持有并且对象在作用域内

3. 不可见阶段(Invisible)

程序本身不再持有该对象的任何强引用,但是这些引用可能还存在着;
一般具体是指程序的执行已经超过该对象的作用域

  1. boolean isChild = false;
  2. if(isChild){
  3. int age = 1;
  4. for(int i = 1;i < 30;i++){
  5. age = i;
  6. }
  7. }
  8. System.out.println(age);// age不可见(超出作用域了)

4. 不可达阶段(Unreachable)

该对象不再被任何强引用所持有;
可能仍被JVM等系统下的某些已经装载的静态变量或者线程或JNI所持有,这些特殊的强引用被称为GC root,这种情况容易导致内存泄露,无法被回收


静态变量、JNI、Thread一般容易成为GCRoot对象,被它们持有的对象容易发生内存泄露

5. 收集阶段(Collected)

对象不可达,并且GC已经准备好对该对象占用的内存空间重新分配的时候,处于手机阶段。
如果重写了finazlie()方法,则会去执行该方法。

尽量不要重写finazlie()方法,因为有可能影响JVM的对象分配与回收速度或者可能造成该对象的再次复活

6. 终结阶段

当对象执行完finalize()方法之后,仍然处于不可达状态时,则该对象进入终结阶段。在这个阶段,内存空间等待GC进行回收

7. 对象空间的重新分配

GC对该对象占有的内存空间进行回收或者再分配,该对象彻底消失

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注