@wangwangheng
2015-09-10T14:52:43.000000Z
字数 879
阅读 2471
Java
对象至少被一个强引用持有并且对象在作用域内
程序本身不再持有该对象的任何强引用,但是这些引用可能还存在着;
一般具体是指程序的执行已经超过该对象的作用域了
boolean isChild = false;
if(isChild){
int age = 1;
for(int i = 1;i < 30;i++){
age = i;
}
}
System.out.println(age);// age不可见(超出作用域了)
该对象不再被任何强引用所持有;
可能仍被JVM等系统下的某些已经装载的静态变量或者线程或JNI所持有,这些特殊的强引用被称为GC root,这种情况容易导致内存泄露,无法被回收
静态变量、JNI、Thread一般容易成为GCRoot对象,被它们持有的对象容易发生内存泄露
对象不可达,并且GC已经准备好对该对象占用的内存空间重新分配的时候,处于手机阶段。
如果重写了finazlie()
方法,则会去执行该方法。
尽量不要重写finazlie()方法,因为有可能影响JVM的对象分配与回收速度或者可能造成该对象的再次复活
当对象执行完finalize()
方法之后,仍然处于不可达状态时,则该对象进入终结阶段。在这个阶段,内存空间等待GC进行回收
GC对该对象占有的内存空间进行回收或者再分配,该对象彻底消失