HotSpot 垃圾收集器实现
Serial Collector(串型收集器)
适用收集场景:1. 新生代收集(Young Generation Collection)2. 老年代收集(Old Generation Collection)
Parallel Conllector(并行收集器)
适用收集场景:1. 新生代收集是并行处理。2. 老年代收集和 Serial Collector
一样。
Parallel Compacting Collector(并行压缩收集器)
.
Note: Eventually, the parallel compacting collector will replace the parallel collector.
上述文字中 斜体 文字告诉我们,这个收集器和上一个并行收集器唯一的不同是在老年代使用了新的算法。
适用收集场景:1. 新生代收集(Young Generation Collector) 和Parallel Collector 相同;2. 老年代收集(Old Generation Collector)
Concurrent Mark-Sweep (CMS) Collector (并发标记清除)
concurrent mark-sweep(CMS) collector
,通常也被称为
低延时收集器low-latency collector
.
适用场景: 仅适用于老年代,新生代处理方式和Parallel Collector相同。
计划将G1作为CMS收集器的长久替代物。
它是为了平衡 延时和吞吐量之间的一种最优关系。
G1将堆分成若干固定大小的Region/区域(区域大小只有1、2、4、8、16和32M),G1的新生代和老年代都是一个无需连续的区域集合,每一个区域独立进行内存的分配和回收,区域是内存管理的基本单元,在某一个时间节点,可能是空闲的,当内存被请求时,内存管理器将空闲的Region分配到某个分代,然后归还应用分配给的空间。
大多数情况下,GC的操作同一时间只会在一个区域进行。
Region 分布
超大对象(Humongous Objects)
下图中跨区域的灰色模块即代表了超大对象,超大对象是指那些空间大小 >=1/2
个区域空间的对象.超大对象有时候会被以下特殊方式处理:
回收周期
Young-only
Young-only 阶段的垃圾 收集 时逐渐地将老年代的对象填充到当前可用的内存。即将可以提升的新生代对象提升到老年代。
该阶段开始于Young-only的 收集 动作,也就是下图中的蓝色小球,每一个小球都是一次收集动作,也就是提升对象到老年代。Young-only 与Space-reclamation 过渡实际上是开始于 老年代空间 *占用*
达到某个阈值,即Heap初始化占用阈值。此时,G1将调度Initial Mark的Young-only收集(蓝色大球),而非常规的Young-only(蓝色小球)收集。
此类收集开始于标记过程,附带一个常规的Young-only收集,并发标记决定所有在老年代区域中可达的存活对象是否要遗留到Space-reclamation 阶段。当标记过程未结束时,常规的Young-only 收集可能已经发生,等到标记完成时,将伴随着两个特殊的 Stop-The-World
停顿, Remark
和 CleanUp
.
Remark 停顿
因为在 Initial Mark
标记过程中,因为它是并发执行,有可能会发生 Young-only
收集,造成标记数据有误差,因此需要重新标记一次,该过程为串行执行,会造成 Stop-The-World
.
在Remark 和Cleanup之间,G1将并发地计算出一份对象存活性总结报告,它将在Cleanup停顿阶段更新内部的数据结构
该停顿同样将完整的回收空闲区域,并且决定 Space-reclamation
阶段是否需要继续跟踪,如果继续跟随的话,Young-only阶段的完成仅仅做 Young-only
收集动作。
Space-reclamation
Space-reclamation(空间回收/复用)阶段是回收老年代空间,同时处理新生代。
这个阶段由多个混合的收集动作组成,不仅包含新生代区域,同时也会排除老年代区域的存活对象,当G1发觉依然无法满足空闲的空间请求时,G1会终止本阶段。如果应用消耗完内存,G1将执行 Stop-The-World
的全堆压缩(Full GC)。
如下图所示:
<img src =" https://i.loli.net/2019/08/05... ; width="400" >
2种过程是循环往复收集。
Initiating Heap Occupancy Percent(IHOP): Initial Mark 收集触发的阈值,为老年代空间定义Heap占用的百分比。
JVM 设置参数:-XX:InitiatingHeapOccupancyPercent
默认情况下,根据标记时间以及老年代在标记周期中的内存分配,G1垃圾收集器将自动抉择理想的IHOP的值。
JVM 失效参数:-XX:-G1UseAdaptiveIHOP
修改区域空间大小
-XX:G1HeapRegionSize
Young-only
和 Space-reclamation