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》,另外,对象可能在该方法中复活。

七、被释放状态
    内存释放之后的状态,是垃圾回收的最后一步。

posted on 2011-04-11 19:00  爱吃草莓的维尼  阅读(147)  评论(0编辑  收藏  举报

导航