【JVM GC核心参数】JVM原理,JAVA 各种垃圾回收器的核心参数,JAVA GC回收器参数配置,核心参数说明
一、在介绍垃圾回收器参数之前,我们看看各个垃圾回收器GC使用的是什么垃圾回收算法:
序号 | 垃圾回收器名称 | 单线程还是多线程 | GC算法 | 参数 |
1 | Serial | · 单线程 · 会STW · Client模式使用 · 新生代回收器 | 复制算法 | |
2 | ParNew垃圾收集器 | · 多线程 · serial的多线程版本 · 默认开启的收集线程数与CPU数量相同 · 新生代回收器 · 追求尽量少的停顿时间 | 复制算法 | |
3 | Parallel Scavenge垃圾收集器 | · 多线程 · 新生代回收器 · 追求cpu吞吐量
- ParNew收集器追求降低GC时用户线程的停顿时间,适合交互式应用,良好的反应速度提升用户体验.
- Parallel Scavenge追求CPU吞吐量,能够在较短的时间内完成指定任务,因此适合不需要太多交互的后台运算.
| 复制算法 |
- -XX:GCTimeRadio 直接设置吞吐量大小,GC时间占总时间比率.相当于是吞吐量的倒数.
- -XX:MaxGCPauseMillis 设置最大GC停顿时间. Parallel Scavenge会根据这个值的大小确定新生代的大小.如果这个值越小,新生代就会越小,从而收集器就能以较短的时间进行一次回收;但新生代变小后,回收的频率就会提高,吞吐量也降下来了,因此要合理控制这个值.
- -XX:+UseAdaptiveSizePolicy 通过命令就能开启GC 自适应的调节策略(区别于ParNew).我们只要设置最大堆(-Xmx)和MaxGCPauseMillis或GCTimeRadio,收集器会自动调整新生代的大小、Eden和Survior的比例、对象进入老年代的年龄,以最大程度上接近我们设置的MaxGCPauseMillis或GCTimeRadio.
|
4 | Serial Old垃圾收集器 | · 单线程 · 老年代垃圾回收器 | 标记-整理算法 | |
5 | Parallel Old垃圾收集器 | · 多线程 · 老年代垃圾回收器 · Parallel Scavenge的老年代版本 · 追求cpu吞吐量 · 会STW | 标记-整理算法 | |
6 | CMS垃圾收集器(Concurrent Mark Sweep) | · 多线程 · 追求最短停顿时间 · 用户线程和gc线程不停切换,有不小开销 · 老年代垃圾回收器 · java 9 已经去掉了cms 初始标记 - STW 并发标记 重新标记 - STW 并发清理 | 标记-清除算法 | cms的缺点: · 吞吐量低 · 无法处理浮动垃圾,导致频繁Full GC · 使用"标记-清除"算法产生碎片空间 cms full gc的由来: 用户线程需要在老年代中分配内存时发现空间不足,就需再次发起Full GC,而此时CMS正在进行清除工作,因此此时只能由Serial Old临时对老年代进行一次Full GC.
- 开启-XX:+UseCMSCompactAtFullCollection 开启该参数后,每次FullGC完成后都会进行一次内存压缩整理,将零散在各处的对象整理到一块儿.但每次都整理效率不高,因此提供了以下参数.
- 设置参数-XX:CMSFullGCsBeforeCompaction 本参数告诉CMS,经过了N次Full GC过后再进行一次内存整理.
|
7 | G1 | · 老年代垃圾回收器 分区域回收 根据
-
初始标记 标记与GC Roots直接关联的对象,停止所有用户线程,只启动一条初始标记线程,这个过程很快. -
并发标记 进行全面的可达性分析,开启一条并发标记线程与用户线程并行执行.这个过程比较长. -
最终标记 标记出并发标记过程中用户线程新产生的垃圾.停止所有用户线程,并使用多条最终标记线程并行执行. -
筛选回收 回收废弃的对象.此时也需要停止一切用户线程,并使用多条筛选回收线程并行执行. | 多线程 | · G1(Garbage First)是一个横跨新生代和老年代的垃圾回收器 · 它会优先回收死亡对象较多的区域。这也是G1名字 的由来。 · fullgc 特别慢!很多阶段都是 STW 的,所以有了 ZGC! |
8 | ZGC | 大内存 | | |
二、
Java虚拟机(JVM)中的垃圾回收器是负责管理和回收Java堆内存中不再被应用程序使用的对象的重要机制。不同的垃圾回收器有不同的特点和核心参数。以下是几种常见Java垃圾回收器的核心参数概述:
1. 串行垃圾回收器(Serial GC)
- 核心参数:
- 无特定核心参数,因为它主要依赖于JVM的默认行为。
- 可以通过
-XX:+UseSerialGC
启用串行垃圾回收器。
2. 并行垃圾回收器(Parallel GC)
- 核心参数:
-XX:+UseParallelGC
:启用并行回收垃圾器。-XX:ParallelGCThreads
(:毫秒设置),垃圾但这收集只是一个时目标使用的,线程JVM数会,尽力默认为CPU核心数。-XX:MaxGCPauseMillis
:设置垃圾收集器的最大停顿时间目标达到但不保证。-XX:GCTimeRatio
:设置垃圾收集时间与应用时间的目标比率,例如9
表示垃圾收集时间占应用时间的1/10。
3. 并发标记清除垃圾回收器(CMS GC)
- 核心参数:
-XX:+UseConcMarkSweepGC
:启用CMS垃圾回收器。-XX:CMSInitiatingOccupancyFraction
:设置老年代使用多少比例后开始CMS回收,默认值为JDK版本相关,JDK 5及之前为68%,JDK 6及之后为92%。-XX:+UseCMSInitiatingOccupancyOnly
:仅使用设置的CMS触发百分比。-XX:+CMSClassUnloadingEnabled
:允许在CMS回收期间卸载类。-XX:+CMSPermGenSweepingEnabled
(在JDK 8之前):允许在CMS回收期间回收永久代(元空间之前的版本)。
4. G1垃圾回收器(G1 GC)
- 核心参数:
-XX:+UseG1GC
:启用G1垃圾回收器。-XX:MaxGCPauseMillis
:设置垃圾收集的最大停顿时间目标(毫秒),G1会尽量满足此目标。-XX:InitiatingHeapOccupancyPercent
:设置触发标记周期的Java堆占用率阈值,默认值是45%。-XX:G1NewSizePercent
:新生代最小值,默认值5%。-XX:G1MaxNewSizePercent
:新生代最大值,默认值60%。-XX:G1HeapRegionSize
:设置G1垃圾收集器Region大小,取值范围应为1MB到32MB,且应为2的N次幂。-XX:G1ReserverPercent
:G1为分配担保预留的空间比例,默认10%。
注意事项
- 上述参数仅列举了部分核心参数,每种垃圾回收器都有许多其他可配置参数。
- 参数的具体效果和默认值可能会随JVM版本的不同而有所变化。
- 在实际使用中,应根据应用程序的具体需求和服务器配置来选择合适的垃圾回收器和调整相应的参数。
- 对于复杂的生产环境,建议进行充分的基准测试和性能评估来找到最佳的垃圾回收器配置。
综上所述,Java提供了多种垃圾回收器供选择,每种回收器都有其独特的核心参数,通过合理配置这些参数,可以优化Java应用程序的性能和资源利用率。