内容来自《Java 程序员面试笔试宝典 第2版》

根据对象的生命周期的长短把对象分成不同的种类(年轻代、老年代和永久代),并分别进行内存回收,这就是分代垃圾回收。

分代垃圾回收算法的主要思路如下所示:把堆分成两个或者多个子堆,每一个子堆被视为一代。在运行的过程中,优先收集那些年幼的对象,如果一个对象经过多次收集仍然存活,那么就可以把这个对象转移到高一级的堆里,减少对其的扫描次数。

目前最常用的JVM是SUN公司(现被Oracle公司收购)的HotSpot,它采用的算法为分代回收。

HotSpot把JVM中堆空间划分为三个代:年轻代(YoungGeneration)、老年代(Old Generation)和永久代(PermanentGeneration)。以下将分别对这三个代进行分析。

1)年轻代(Young Generation):被分成3个部分,一个Eden区和两个相同的Survivor区。Eden区主要用来存储新建的对象,Survivor区也被称为from和to区,Survivor区是大小相等的两块区域,在使用“复制”回收算法时,作为双缓存,起到内存整理的作用,因此,Survivor区始终都保持一个是空的。

2)老年代(Old Generation):主要存储生命周期较长的对象、超大的对象(无法在年轻代分配的对象)。

3)永久代(Permanent Generation):存放代码、字符串常量池、静态变量等可以持久化的数据。SunJDK把方法区实现在了永久代。

它们的划分关系如图5-2所示。