Java GC
Java对象的生命周期:
1、已创建——Created
2、在用——In use (strongly reachable)
3、不可见——Invisible
4、不可达——Unreachable
5、被回收——Collected
6、已逆初始化——Finalized
7、已释放——Deallocated
一、已创建状态
创建过程:
1、分配对象空间;
2、调用构造函数; //并未执行函数体,只是进入函数入口
3、调用父类构造函数; //这个过程是递归的
4、初始化实例变量;
5、执行构造函数体的剩余部分。
public Square extends Shape {
public int edge = 0;
public Square() {
Log.d("Square", "construction");
}
}
1、分配内存
2、进入Square()
3、进入Shape()
4、为edge赋值
5、打印Log
二、在用状态
对象至少被一个强引用所持有才被视为在用,意即软引用、弱引用、虚引用都不算。
三、不可见状态
程序中如果没有任何强引用可以访问该对象,对象进入不可见状态(有指向该对象的引用变量,但该变量超出了作用域)。注意,并非所有对象都会进入此状态。
四、不可达状态
如果没有任何指向该对象的强引用存在,对象进入不可达状态(没人任何指向该对象的引用变量)。注意,只是作为被收集的候选者并不意味着一定会被立刻收集。
并不是任何强引用都会驻留在内存,必须可以路由至垃圾回收的根,根包括:
1、栈中的临时变量
2、静态变量
3、JNI原生代码中的全局引用
当循环引用中的所有元素都进入不可达状态时,就会都成为垃圾收集的候选者(判断不可达的算法基于有向图)。
五、被收集状态
当垃圾自动回收器认识到该对象是不可达的,便会做释放前的最后处理:如实现了finalize方法则会调用该方法,否则直接进入逆初始化状态。
六、已逆初始化状态
当调用finalize方法后,对象仍然是不可达的,则对象进入已逆初始化状态,此时对象成为被释放的候选者。最好不要实现finalize方法,理由同《Effective Java》,另外,对象可能在该方法中复活。
七、被释放状态
内存释放之后的状态,是垃圾回收的最后一步。