HotSpot垃圾收集器
新生代:
Serial收集器
它是一种单线程垃圾收集器
1. 使用一个CPU或者一条线程完成垃圾回收
2. 在进行垃圾回收时,必须暂停其他所有工作线程 stop the Word
3. 采取复制算法
4. client模式下默认的新生代收集器。对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。
5. -XX:+UseSerialGC 指定新生使用新生代串行收集器和老年代串行收集器, 当以client模式运行时, 它是默认的垃圾收集器
parNew
- ParNew收集器其实就是serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为与Serial收集器一样。
- 除了Serial收集器外,只有它可以与CMS收集器配合工作。
- 并行:指多条垃圾收集线程并行工作,用户线程等待。
- -XX:+UseParNewGC 新生代使用ParNew回收器, 老年代使用串行回收器
-XX:+UseConcMarkSweepGC 新生代使用ParNew回收器, 老年代使用CMS回收器 +serial Old
-XX:ParallelGCThreads=n 指回ParNew回收器工作时的线程数量, cpu核数小时8时, 其值等于cpu数量, 高于8时,可以使用公式(3+((5*CPU_count)/8))
Parallel Scavenge收集器
- 使用复制算法的并行多线程收集器
- CMS等收集器的关注点是缩短垃圾收集时用户的停顿时间,Parallel Scavenge收集器目标是达到一个可控制的吞吐量。吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
- -XX:+UseParallelGC 新生代用ParallelGC回收器, 老年代使用串行回收器
-XX:+UseParallelOldGC 新生代用ParallelGC回收器, 老年代使用ParallelOldGC回收器系统吞吐量的控制:
-XX:MaxGCPauseMillis=n(单位ms) 设置垃圾回收的最大停顿时间,
-XX:GCTimeRatio=n(n在0-100之间) 设置吞吐量的大小, 假设值为n, 那系统将花费不超过1/(n+1)的时间用于垃圾回收
-XX:+UseAdaptiveSizePolicy 打开自适应GC策略, 在这种模式下, 新生代的大小, eden,survivior的比例, 晋升老年代的对象年龄等参数会被自动调整,以达到堆大小, 吞吐量, 停顿时间之间的平衡点。
老年代:
Serial Old收集器
- Serial Old是Serial收集器的老年代版本, 同样是单线程收集器,使用“标记-整理”算法。
- -XX:+UseSerialGC 新生代, 老年代都使用串行回收器
-XX:+UseParNeGC 新生代使用ParNew回收器, 老年代使用串行回收器
-XX:+UseParallelGC 新生代使用ParallelGC回收器, 老年代使用串行回收器
Parallel Old收集器
使用多线程和“标记-整理”算法, 吞吐量优先, 主要与Parallel Scavenge配合在注重吞吐量及CPU资源敏感系统内使用
CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。CMS收集器是基于“标记-清除”算法实现的,整个收集过程大致分为4个步骤:
1. 初始标记
stop the word 标记GC Roots能直接关联到的对象。
2. 并发标记
GC Roots根搜索算法阶段,会判定对象是否存活。
3. 重新标记
stop the Word 修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间会被初始标记阶段稍长,但比并发标记阶段要短。
4. 并发清除
G1收集器
- 特点:
并行与并发:使用多个CPU来缩短Stop-The-Word停顿的时间。
分代收集:分代概念保留
空间整合:基于标记-整理算法,从两个Region之间来看是基于“复制”算法实现的。不会产生内存空间碎片。
可预测的停顿:使用者可以明确指定垃圾回收时间
内存布局:将整个java堆分为多个大小相等的region区,G1跟踪各个Region里面的垃圾堆价值大小,在后台维护一个优先列表,在允许的收集时间,优先回收价值最大的Region(Garabage-First)。使用Remembered Set来避免全堆扫描。
(2)G1的收集过程
初始标记
并发标记
最终标记
筛选回收
(3)设置参数:
-XX:+UseG1GC 打开G1收集器开关,
-XX:MaxGCPauseMillis=n 指定目标的最大停顿时间,任何一次停顿时间超过这个值, G1就会尝试调整新生代和老年代的比例, 调整堆大小, 调整晋升年龄
-XX:ParallelGCThreads=n 用于设置并行回收时, GC的工作线程数量
-XX:InitiatingHeapOccpancyPercent=n 指定整个堆的使用率达到多少时, 执行一次并发标记周期, 默认45, 过大会导致并发标记周期迟迟不能启动, 增加FullGC的可能, 过小会导致GC频繁, 会导致应用程序性能有所下降
https://www.zhihu.com/question/59988435/answer/171283869
https://zhidao.baidu.com/question/1111800566588999699.html