jvm 年轻代、年老代、永久代

关键字约定java

 

  • Young generation –>新生代
  • Tenured / Old Generation –>老年代
  • Perm Area –>永久代

 

年轻代:

  全部新生成的对象首先都是放在年轻代的。年轻代的目标就是尽量快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个 Survivor区(通常而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时,此区的存活对象将被复制到另一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的而且此时还存活的对象,将被复制“年老区(Tenured)”。须要注意,Survivor的两个区是对称的,没前后关系,因此同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。并且,Survivor区总有一个是空的。同时,根据程序须要,Survivor区是能够配置为多个的(多于两个),这样能够增长对象在年轻代中的存在时间,减小被放到年老代的可能。算法

年老代:

  在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。所以,能够认为年老代中存放的都是一些生命周期较长的对象。多线程

永久代:

  用于存放静态文件,现在Java类、方法等。永久代对垃圾回收没有显著影响,可是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候须要设置一个比较大的永久代空间来存放这些运行过程当中新增的类。永久代大小经过-XX:MaxPermSize=<N>进行设置。性能

 

 

  包括 垃圾回收算法
年轻代 Eden区、s0、s1区 复制算法
老年代   标记压缩

 

对象如何进入老年代:

一、通常来讲,对象达到必定年龄后就会进入老年代,对象的年龄是由gc的次数决定的,在新生代中,每gc一次,对象若是没有被回收的化年龄就会+1。优化

二、大对象(新生代Eden区没法装入时,会直接进入老年代)。spa

 

垃圾回收算法:

一、复制算法:其核心思想就是将内存个空间分为两块,每次只使用其中一块,在垃圾回收时,在垃圾回收时,将正在使用的内存中的存留对象复制到未被使用的内存块中去,以后去清除以前正在使用的内存块中全部的对象,反复去交换两个内存的角色,完成垃圾收集。java中新生代from和to空间就是使用这个算法。线程

二、标记压缩算法:标记压缩法在标记清除法基础上作了优化,把存活的对象压缩到内存一端,然后进行垃圾清理。Java老年代使用的就是标记压缩算法。code

 

 

垃圾收集器

串行回收器

    使用单线程进行垃圾回收的回收器。每次回收时,串行回收器只有一个工做线程,对于并行能力较弱的计算机来讲,串行回收器的专一性和独占性每每有更好的性能表现。对象

    串行回收器能够在新生代和老年代使用,根据做用于不一样的堆空间,分为新生代串行回收器和老年代串行回收器。生命周期

    经过JVM参数-XX:+UseSerialGC能够设置新生代串行垃圾回收器和老年代串行垃圾回收器。

并行回收器(parNew回收器)

    并行回收器在串行回收器的基础上作了改进,他可使用多线程同时进行垃圾回收,对于计算能力强的计算机而言,能够有效的缩短垃圾回收所需的实际时间。

    parNew回收器是一个工做在新生代的垃圾回收器,他只是简单的将串行回收器多线程化,他的回收策略和算法和串行回收器同样。

    经过JVM参数-XX:+UseParNewGC新生代ParNew回收器,老年代则使用串行回收器。

    ParNew回收器工做时的线程数量可使用-XX:ParallelGCThreads参数指定,通常最好和计算机的CPU至关,避免过多的线程影响性能。