Java 垃圾回收机制

分代回收的思想

在Java中,我们必须了解不同对象的生命周期是不同的的事实。为了更好的回收垃圾,基本上所有的jvm都采用了按代的垃圾回收机制。

分代回收的最基本做法,就是将内存中的区域划分为3个不同的部分:年轻代,年老代,永久代(持久代)。

注意,在jdk1.6后,永久代被取消了。

什么时候需要执行GC

Young GC(只针对年轻代的)

Full GC(针对整个堆)

回收哪些内存

通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的

什么是GCRoots?

被GC判定为不可达对象一定会被回收么?

jvm中,一个对象真正的被GC至少要经历两次的标识,第一次是经过GCRoots来标识,如果标识上对象不可达了,那么这个对象会进行下一轮的刷选(如果该对象重写finalize方法,则会认为有必要进行下一轮的判定,否则直接回收)。 如果重写finalize()方法,jvm就会将该对象加入的F-Queue中,稍后,jvm会创建一条自动建立的、低优先级的Finalizer线程去执行GC判定(注意这里是需要时间的),如果执行完后,该对象还没重生的话,那么对象就会被真正的回收

如何执行GC