java学习-hotspot垃圾回收器

垃圾回收器的进阶

  • serial collector: 可以作用于 young/old generation , 单线程
  • parallel collector:只能作用于 young generation , 多线程
  • parallel compact collector : 只能作用于 old generation,多线程
  • cms(concurrent mark-sweep collector) : 只能作用于 old generation ,多线程
  • g1(garbage first) : 作用于整个heap 以及 non-heap

gc的重点在于分代

  • young generation
    • 相关算法主要是 mark-copy: 对于 young generation 中只会存在标记移动操作,每次gc时都会完全清除eden和survivor-from 区域  
  • old generation 和 metaspace(主要在full gc 时会操作)
    • 相关算法主要是 mark-sweep-compact 和 mark-summary-compact(parallel compact collector)

 

  • 不同的垃圾回收器进阶过程
    • 所有generation 都是串行处理的 serial collector
    • 串行太慢,进阶为parallel ,但只支持 young generation ,对于old generation 依然使用 serial collector 的 parallel collector
    • 虽然young generation 现在使用的了并行处理提高了处理效率,但old generation 依旧串行处理太慢,因此为了提高 old generation 处理效率,提出了 mark-summary-compact 算法的 parallel compacting collector
    • 虽然parallel compacting 在一定程度上使用了多线程,在mark 和 compact阶段是使用多线程进行操作导致短暂的STW; 而在summary阶段却是使用的串行操作,会导致STW时间变长
    • 由于parallel compacting 的性能消耗,为了更快的提高old generation的gc效率,首先,执行initial mark 对直接可达的对象进行操作,虽然这里使用的串行操作,但由于计算量少,因此实际STW时间也较短;随后会有一个gc线程和其他线程并行操作,对 initial mark 中的对象进行引用标记;由于在运行阶段也会存在对象不可达的情况,因此,此时会STW,并使用多gc线程对并行阶段标记的对象再次重新标记;保证不会有遗漏或误判的情况(由于此时为STW,因此在此过程不会有对象的生命周期发生变化); 之后会有一个单独的gc线程并行来执行清扫工作; 对于 cms 虽然在标记清扫阶段效率较高,但其不会进行压缩,因此当进行大量full gc 操作时,会造成大量内存碎片,导致更多的full gc的产生

G1垃圾回收

https://docs.oracle.com/en/java/javase/12/gctuning/garbage-first-garbage-collector.html#GUID-98E80C82-24D8-41D4-BC39-B2583F04F1FF

posted @ 2020-10-27 18:01  郭星  阅读(112)  评论(0)    收藏  举报