垃圾收集器参数配置

本文详细介绍了JDK8及其以下版本中各种垃圾回收器的参数配置,包括通用配置、Serial、ParNew、ParallelScavenge、SerialOld、ParallelOld、CMS以及G1收集器的特定选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇文章粗略介绍了jdk8及以下版本中的常见的垃圾回收器:垃圾收集器,这篇文章来列一下在对应的收集器都有哪些参数配置。

通用配置

选项

描述

使用示例

-Xms

设置Java堆的初始大小。当可用的Java堆区内存小于40%时,JVM就会将内存调整到选项-Xmx所允许的最大值

-Xms100M

-Xmx

设置Java堆的最大值。当可用的Java堆区内存大于70%时,JVM就会将内存调整到选项-Xms所指定的初始值。与-Xms设置为一样的话可以避免堆自动扩展带来的性能开销。

-Xmx300M

-Xss

设置栈容量大小。每个线程都拥有一个栈,生命周期与线程相同,每个方法的调用都会创建一个栈帧。在堆容量确定的情况下,栈容量越大意味着能建立的线程越少。

-Xss2M

-Xmn

设置新生代的大小。-Xmn的内存大小为Eden+2个Surivivor空间的值,官方建议配置为整个堆的3/8。

-Xmn100M

-XX:NewSize

设置新生代的初始大小。和-Xmn等价,推荐使用-Xmn,相当于一次性设定了NewSize与MaxNewSize的内存大小。

-XX:NewSize=100M

-XX:MaxNewSize

设置新生代的最大值

-XX:MaxNewSize=100M

-XX:NewRatio

新生代(Eden+2个Surivivor空间)与老年代(不包括永久代)的比值

-XX:NewRatio=4,表示新生代与老年代所占的比值为1:4

-XX:SurivivorRatio

Eden与一个Surivivor的比值大小。默认为8:1,即Eden占8/10。

-XX:SurvivorRatio=8

-XX:PermSize

设置非堆内存(方法区,永久代)的初始大小。方法区主要存放Class相关信息,如类名、访问修饰符、常量池、字段描述等。

-XX:PermSize=10M

-XX:MaxPermSize

设置非堆内存(方法区,永久代)的最大值

-XX:MaxPermSize=50M

-XX:MaxDirectMemorySize

设置本机直接内存大小。一般通过Unsalf类来操作直接内存。

-XX:MaxDirectMemorySize=100M

-XX:PretenureSizeThreshold

设置对象超过指定字节大小时直接分配到老年代

-XX:PretenureSizeThreshold=3145728

-XX:+HandlePromotionFailure

是否允许新生代收集担保失败。
进行一次minor gc后, 另一块Survivor空间不足时,将直接会在老年代中保留

-XX:+HandlePromotionFailure

-XX:ParallelGCThreads

设置并行GC进行内存回收的线程数

-XX:ParallelGCThreads=4

-XX:MaxTenuringThreshold

晋升到老年代的对象年龄。每次Minor GC之后,存活年龄就加1,当超过这个值时进入老年代。默认为15

-XX:MaxTenuringThreshold=15

-XX:+HeapDumpOnOutOfMemoryError

内存溢出时Dump出当前的内存堆转储快照以便事后进行分析

-XX:+HeapDumpOnOutOfMemoryError

-XX:+PrintGCDetails

发生垃圾收集时打印详细回收日志,
并且在退出的时候输出当前内存区域分配情况。

-XX:+PrintGCDetails

XX:+PrintGCDateStamps

 输出GC时的时间戳

XX:+PrintGCDateStamps

XX:+PrintHeapAtGC

在进行GC的前后打印出堆的信息

XX:+PrintHeapAtGC

-XX:+PrintGCApplicationStoppedTime

输出GC造成应用暂停的时间

-XX:+PrintGCApplicationStoppedTime

-Xloggc

日志文件的输出路径

-Xloggc:./logs/gc.log

-XX:+DisableExplicitGC

是否关闭手动System.gc

-XX:+DisableExplicitGC

Serial收集器

选项

描述

使用示例

-XX:+UseSerialGC

开启Serial收集器。
年轻代收集,单线程收集,采用复制算法,默认Client模式默认收集器,对于单核CPU和堆内存小使用效率比较好。
缺点是Stop-the-world。

-XX:+UseSerialGC

ParNew收集器

选项

描述

使用示例

-XX:+UseParNewGC

开启ParNew收集器。
年轻代收集,多线程,采用复制算法,好处是速度快,可开启多个垃圾线程收集,
优点是可并行运行,缺点单核CPU下效率不比Serial收集器快。
除了Serial收集器外,目前只有它能和CMS收集器配合工作。
它也是使用CMS收集器时默认的新生代收集器。

-XX:+UseParNewGC

Parallel Scavenge收集器

选项

描述

使用示例

-XX:+UseParallelGC

开启Parallel Scavenge收集器。
年轻代收集,采用复制算法,可并行多线程收集器,
优点是注重吞吐量,缺点是停顿时间较长,用户体验不太好。

-XX:+UseParallelGC

-XX:MaxGCPauseMillis

最大GC停顿时间(毫秒),虚拟机将尽可能保证回收停顿时间不超过设定值。

-XX:MaxGCPauseMillis=10

-XX:GCTimeRatio

垃圾收集时间占总时间的比值,相当于吞吐量的倒数。
例如设置吞吐量19,那最大GC时间就占总时间5%(1/(1+19)),默认值99。

-XX:GCTimeRatio=99

-XX:+UseAdaptiveSizePolicy

自适应调节策略,当打开这个参数之后,
JVM会根据运行情况收集性能监控信息,
将动态调整这些参数(如-Xmn,-XX:SurivivorRatio,-XX:PretenureSizeThreshold等)

-XX:+UseAdaptiveSizePolicy

Serial Old收集器

选项

描述

使用示例

-XX:+UseSerialOldGC

开启Serial Old收集器。
老年代收集,单线程,采用标记整理算法,优缺点和Serial收集器类似

-XX:+UseSerialOldGC

Parallel Old收集器

选项

描述

使用示例
-XX:+UseParallelOldGC

开启Parallel Old收集器。
老年代收集,多线程,采用标记整理算法。
优缺点和Parallel Scavenge收集器一样,只是之前老年代收集只有Serial Old收集,
所以Parallel Scavenge收集和Serial Old收集组合一起发挥不了吞吐量的优势,
所以出现了该收集器。
注重吞吐量以及CPU资源敏感的场合,优先考虑Parallel Scavenge+Parallel Old收集器。

-XX:+UseParallelOldGC

CMS收集器

选项

描述

使用示例

-XX:+UseConcMarkSweepGC

开启CMS收集器。
老年代收集,多线程,采用标记清除算法,
优点是可并行并发处理,注重停顿时间,用户体验更快,
缺点是产生浮动垃圾,内存碎片,吞吐量会下降。

-XX:+UseConcMarkSweepGC

-XX:CMSInitiatingOccupancyFraction

由于CMS收集存在浮动垃圾,CMS不能等到老年代用尽才进行回收,
而是使用率达到设定值就触发垃圾回收。不能设置太高,
否则会出现“Concurrent Mode Failure”错误而
临时启用Serial Old收集器导致停顿时间加长。

-XX:CMSInitiatingOccupancyFraction=70

-XX:+UseCMSInitiatingOccupancyOnly

开启固定老年代使用率的回收阈值,
如果不指定,JVM仅在第一次使用设定值,后续则自动调整。

-XX:+UseCMSInitiatingOccupancyOnly

-XX:+UseCMSCompactAtFullCollection

开启对老年代空间进行压缩整理(默认开启)。
由于CMS收集会产生内存碎片,所以需要对老年代空间进行压缩整理。

-XX:+UseCMSCompactAtFullCollection

-XX:CMSFullGCsBeforeCompaction

设置执行多少次不压缩的Full GC后,紧接着就进行一次压缩整理
(默认为0,每次都进行压缩整理)。

-XX:CMSFullGCsBeforeCompaction=5

-XX:+CMSScavengeBeforeRemark

执行CMS 重新标记(remark)之前进行一次Young GC,
这样能有效降低remark时间。

-XX:+CMSScavengeBeforeRemark

G1 收集器

选项

描述

使用示例

-XX:+UseG1GC

开启G1收集器。
年轻代和老年代共用,多线程处理,采用标记整理算法,
优点是可并行并发处理、分代收集,空间整合、有点回收垃圾多的区域、可预测低停顿;
G1收集分四个步骤:初始标记==>并发标记==>最终标记==>筛选回收;
G1收集做法是将堆划分大小一样的Region区域,针对具体的区域回收,
通过Remembered Set方式避免全堆扫描,每个Region都有对应的Remembered Set,
每次Reference类型数据写操作时,JVM产生一个Write Barries进行终端,
检查Reference引用的对象是否处于不同的Region之间,
如果是,通过Card Table把相关引用信息记录到被引用对象的Remembered Set中,
那么进行可达性分析时加入Remembered set记性扫描。

-XX:+UseG1GC

-XX:MaxGCPauseMillis

设置最大GC停顿时间。这是一个软性指标, JVM 会尽量去达成这个指标。

-XX:MaxGCPauseMillis=10

-XX:InitiatingHeapOccupancyPercent

启动并发GC周期时的堆内存占用百分比。G1用它来触发并发GC周期,基于整个堆的使用率而不只是某一代内存的使用比。
值为
0 则表示"一直执行GC循环" 默认值为 45

-XX:InitiatingHeapOccupancyPercent=70

-XX:ParallelGCThreads

设置垃圾收集器在并行阶段使用的线程数,默认值随JVM运行的平台不同而不同。

-XX:ParallelGCThreads=4

-XX:ConcGCThreads

并发垃圾收集器使用的线程数量。默认值随JVM运行的平台不同而不同。

-XX:ConcGCThreads=4

-XX:G1ReservePercent

设置预留堆大小百分比,防止晋升失败,默认值是 10

-XX:G1ReservePercent=20

-XX:G1HeapRegionSize

指定每个heap区的大小,默认值将根据 heap size 算出最优解。
最小值为
1Mb,最大值为 32Mb

-XX:G1HeapRegionSize=16M

-XX:InitialSurvivorRatio

设置Survivor区的比例,默认为5。

-XX:InitialSurvivorRatio=10

-XX:+PrintAdaptiveSizePolicy

打印自适应收集的大小。默认关闭。

-XX:+PrintAdaptiveSizePolicy

-XX:G1MixedGCCountTarget

混合GC数量,默认为8。
减少该值可以解决晋升失败的问题(代价是混合式GC周期的停顿时间会更长)。

-XX:G1MixedGCCountTarget=8

 

 

转载于:https://my.oschina.net/dslcode/blog/3007693

### G1垃圾收集器最佳配置参数 对于G1垃圾收集器的最佳配置,需考虑多个方面来优化其性能表现。针对不同应用场景下的需求差异,合理设置JVM启动参数至关重要。 #### 设置最大停顿时间目标 为了控制应用响应速度,在初始化虚拟机时应指定期望的最大垃圾回收停顿时间。这通过`-XX:MaxGCPauseMillis=<N>`实现,其中 `<N>` 表示毫秒数。较小的数值有助于减少单次GC造成的延迟影响,但过低可能导致频繁触发Full GC从而拖慢整体效率[^4]。 #### 新生代比例调节 适当调整新生代所占堆的比例可以有效提升吞吐量并缩短平均暂停时间。可以通过如下两个选项来进行微调: - `-XX:G1NewSizePercent=NN`: 设定最小百分比,默认为5% - `-XX:G1MaxNewSizePercent=MM`: 上限不超过总容量的 MM % ,默认60% 这种动态机制允许G1依据实际负载情况灵活改变Eden区及其他年轻代区域尺寸,确保既不影响程序执行也不浪费过多资源[^5]。 #### 启用并发周期预测功能 启用此特性能够帮助规划者提前预估未来一段时间内的内存消耗趋势,进而更精准地安排混合模式下老年代扫描工作。只需简单加入命令行开关即可开启该能力: ```bash -XX:+UnlockExperimentalVMOptions -XX:+G1ConcRefinementThreadsAutoTune ``` #### 配置线程数量 根据物理CPU核心数目适配参与标记过程的工作线程总数也很重要。一般情况下可参照下面的方式设定具体值: ```bash -XX:ParallelGCThreads=N -XX:ConcGCThreads=M ``` 这里 `N` 和 `M` 分别对应于并行阶段以及并发阶段投入使用的处理器核数。通常建议前者接近甚至等于机器的实际多处理能力;后者则取前者的约四分之一左右作为经验值[^1]。 #### 调整堆外溢阈值 为了避免不必要的碎片化现象发生,还可以利用特定参数限制未被充分利用部分在整个堆中的占比范围: ```bash -XX:G1HeapWastePercent=X ``` 这里的 X 值定义了当可用空间低于这一比率时即视为存在“浪费”,促使系统尽快采取措施加以清理整顿。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值