架构师训练营第九周作业 - 命题作业
JVM 垃圾回收的基础是可达性分析算法,就是以虚拟机栈中的引用变量为起点,向下查找,找到引用不可达的对象作为可回收对象。
具体如何回收,不同的垃圾收集器采用了不同的垃圾回收算法:
1、Serial GC,最早的垃圾收集器,单线程。Serial GC 将堆分为新生代、老年代和永久代,新生代存储新创建的对象,经过多次垃圾收集之后无法回收的对象或者大对象将会存储到老年代,而永久代负责存储类和静态变量。新生代采用标记-复制算法,标记-复制算法简单来说就是将无法回收的对象复制到新的区域,新生代本身还会分成多个区域,用来存储不同次数没有被回收掉的对象。老年代采用标记-整理算法,即清除标记对象后,将对象进行整理,防止内存空间过于碎片化。
2、ParNew GC,新生代垃圾收集器,多线程版的 Serial GC。经常和老年代垃圾收集器 CMS GC 配合使用。
3、CMS GC,老年代垃圾收集器,多线程,采用标记-清除算法,停顿时间非常少。标记清除算法就是将对象标记后直接进行清除,优点是停顿时间少,缺点是容易导致内存空间碎片化。
4、Parallel GC,算法与 Serial GC 比较相似,特点是新生代和老年代垃圾收集并行进行。
5、G1 GC,G1 GC 也有新生代和老年代的概念,但是和以前的垃圾收集器的划分不同,G1 GC 将内存区域划分为多个块儿,这些块儿有的作为新生代、有的作为老年代,还有的专门存储大对象。块儿之间使用标记-复制算法,整体上属于标记-整理算法,G1 GC 在多核 CPU 和大内存的服务器上有非常不错的表现,G1 GC 虽然在最优情况下的性能不如 Parallel GC,但是在处理最差情况的表现要好得多。
评论