年轻代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集器要收集的Java对象关系不大。因此,年轻代和年老代的划分才是对垃圾 收集影响比较大的。对象
全部新生成的对象首先都是放在年轻代的。年轻代的目标就是尽量快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个 Survivor区(通常而言)。 大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当一个Survivor区满 时,此区的存活对象将被复制到另一个Survivor区,当另外一个Survivor区也满了的时候,从前一个Survivor区复制过来的而且此时还存 活的对象,将被复制“年老区(Tenured)”。 须要注意,两个Survivor区是对称的,没前后关系,因此同一个Survivor区中可能同时存在从Eden区复制过来对象,和从另外一个 Survivor区复制过来的对象;而复制到年老区的只有从前一个Survivor区(相对的)过来的对象。并且,Survivor区总有一个是空的。特 殊的状况下,根据程序须要,Survivor区是能够配置为多个的(多于两个),这样能够增长对象在年轻代中的存在时间,减小被放到年老代的可能。生命周期
在年轻代中经历了N(可配置)次垃圾回收后仍然存活的对象,就会被放到年老代中。所以,能够认为年老代中存放的都是一些生命周期较长的对象。内存
用于存放静态数据,如 Java Class, Method 等。持久代对垃圾回收没有显著影响,可是有些应用可能动态生成或者调用一些Class,例如 Hibernate 等,在这种时候须要设置一个比较大的持久代空间来存放这些运行过程当中动态增长的类型。持久代大小经过 -XX:MaxPermSize= 进行设置。io