JVM垃圾回收机制

垃圾回收机制

堆分为 新生代(Young)老年代(Old)

  • Young区 分为Eden区两个Survivor区

    ​ 新创建的对象都在Eden区,当Eden区满后会触发Minor GC,把Eden区回收后仍然存活的对象复制到其中一个空的Survivor区; 同时,另一个Survivor区中存活的对象也复制到这个Survivor中,保证总有一个Survivor区是空的

  • Old区

    ​ Young的Eden区满后会触发Minor GC,把Eden区回收后仍存活的对象放到Survivor区中,如果此时Survivor区仍然存不下这些存活的对象,GC收集器会把这些对象直接存放到Old区;如果在Survivor区中的对象足够老,也直接放到Old区.如果Old区也满了,则触发Full GC,回收整个堆内存

  • Perm区

​ 存放的主要是类的Class对象, 垃圾回收也是由Full GC触发

垃圾回收算法

  • 标记-清除算法

    ​ 对于每个存活的对象,进行标记.标记完成,开始进行清理(未标记)不再存活的对象

    ​ 缺点:产生过多碎片,导致内存不连续,分配大对象时,无法找到足够的内存触发gc,效率不是太高

  • 复制算法

    ​ 用于生存率较低的场景

    把内存分为若干个区域,每次只使用其中一部分,对于存货的对象,copy到另一个区域,对于剩余的对象进行垃圾回收
    

    ​ 缺点:造成内存浪费

    ​ 优点: 无碎片

  • 标记-整理算法

    ​ 类似于标记清理,后续不是直接对对象进行清理,而是进行移动存活对象,边界外进行清除

JVM采用分代的垃圾回收算法

  • 新生代 死的快,存活率低 采用 复制算法 Minor GC
  • 老年代 存活长 采用标记清理 Full GC