java---垃圾收集器调优相关参数

一、HotSpot参数说明

标准参数:以-开头,表示所有版本的HotSpot都支持。

非标准参数:以-X开头,表示特定版本的HotSpot支持;

不稳定参数:以-XX开头,表示有些版本支持,有些版本不支持,下个版本可能就会取消;

可以通过-XX:+PrintFlagsFinal -version | grep xxx(关键词) 参数查询指定的参数,Linux系统。

二、HotSpot常用参数分类

GC常用参数

1.-Xmn 设置年轻代大小

一般使用这个参数将年轻代初始值和最大值设置成同样大小。

2.-Xms 最小(初始)堆内存  -Xmx 最大堆内存

一般将这两个值设置成一样大小,避免JVM在对空间不够用时动态申请内存、释放内存,占用计算资源。

3.-Xss 栈空间

JDK1.5之后默认的栈空间为1M,在系统资源一定的情况下,调小这个值意味着能容纳更多的线程并发执行;但是也不能过小,会导致栈上不够分配局部变量等,通常结合实际业务场景设置。

4.-XX:NewSize 年轻代初始值  -XX:MaxNewSize 年轻代最大值

通常不建议直接使用这两个参数分别设置,可以直接使用-Xmn参数。

5.-XX:UseTLAB 开启线程本地分配,默认是开启的

线程本地分配:由于JVM堆空间是所有线程共享的,也就是说每个线程在堆上分配对象时可能会抢占同一块内存区域而导致效率变低,JVM为了解决这个问题,引入了线程本地分配,JVM会为每一个线程分配一块内存区域专门让指定的线程使用。

6.-XX:PrintTLAB 打印TLAB的使用情况

7.-XX:TLABSize 设置TLAB的大小

8.-XX:+DisableExplictGC 禁用System.gc(),默认是开启的

开启了这个参数,表示System.gc()不可用,而System.gc()会建议系统进行Full GC,不建议修改这个参数。

9.-XX:+PrintGC 打印GC简要信息  -XX:+PrintGCDetails 打印GC详细信息  -XX:+PrintHeapAtGC 打印GC时堆栈的情况  -XX:+PrintGCTimeStamps 打印GC发生的时间戳

10.-verbose:class 显示类加载详细过程

11.-XX:+PrintVMOptions 打印JVM运行时参数

12.-XX:+PrintFlagsFinal -version | grep xxx 查找指定xxx内容的参数,Linux

13.-Xloggc:opt/log/gc.log 记录GC的日志

14.-XX:MaxTenuringThreshold 设置升代年龄

年轻代晋升到老年代对象的年龄阈值,CMS垃圾收集器默认为0,其他一般默认为15(最大值),JVM规定Object对象头markdown对象年龄是4位,所以这个值最大是15。

15.-XX:+HeapDumpOnOutOfMemoryError OOM时自动生产dump文件(重要)

16.-XX:HeapDumpPath=${rootPath}/xxx.hprof 设置dump文件的生成目录

也可以不指定,使用默认的路径。

Parllel(并行,吞吐量优先)常用参数

1.-XX:SurvivorRatio=n Eden区和s0或s1的比值

默认为8,也就是Eden区大小是S0区域的8倍,一般不建议修改。

2.-XX:NewRatio=n 年轻代和老年代大小比例

默认为2,也就是老年代:年轻代=2

3.-XX:PreTenureSizeThreshold 对象直接分配到老年代的大小阈值

比如设置这个值为1M,那么超过1M的对象不会在Eden去分配内存而是直接分配道老年代;默认为0,表示所有对象不管多大都要先在Eden去分配内存。

4.-XX:MaxTenuringThreshold 升代年龄

5.-XX:+ParllelGCThreads 并行收集的线程数

一般设置为CPU的核数。

6.-XX:+UseAdaptiveSizePolicy 自动选择各区比例大小

并行收集器会根据上一次GC统计的GC时间、吞吐量及内存占用等自动调整年轻代各区(Eden、S0、S1)的大小比例,以达成预期(设置)的GC停顿时间,预期的吞吐量以及尽可能少的内存占用的目标,当然,只是尽可能的向预期靠近并不能一定就达到。此参数默认是开启的,建议使用PS+PO时一直开启。

7.-XX:MaxGCPauseMillis=n 设置年轻代垃圾回收的最长时间(是一个期望值)

是一个建议值,JVM会自动调整年轻代大小尽力满足设置的最大时间。

CMS(并发,响应时间优先)常用参数

1.-XX:+UseConc(urrent)MarkSweepGC 使用CMS(SerialOld)+ParNew垃圾收集器组合

JDK1.8之前需要加上()内的。

2.-XX:ParllelCMSThreads 设置CMS线程数

一般设置为CPU核数的一半。

3.-XX:CMSInitialintOccupancyFraction 当老年代内存使用占比多少时开始CMS回收

老年代内存使用多少比例后开始CMS收集,默认是68%(近似值);如果频繁发生SerialOld卡顿,应该调小这个值,值越小,CMS回收会越频繁。避免FGC时老年代没有足够的空间容纳年轻代晋升的对象。

4.-XX:+UseCMSCompactAtFullCollection 并发清理时进行压缩   -XX:+CMSFullGCsBeforeCompaction 多少次FGC之后进行压缩

为了解决CMS碎片化的问题,可以使用上面两个参数;第一个参数表示每当清理时都会压缩。

5.-XX:+CMSClassUnloadingEnabled 开启回收方法区种无用的Class

6.-XX:CMSInitiatingPermOccupancyFraction 进行永久代回收的比例。

JDK1.8之前的参数,1.8之后方法区用Meta Space实现。

7.-XX:MaxGCPauseMillis 建议最大停顿时间。

G1(响应时间和吞吐量兼顾)常用参数

1.-XX:+UseG1GC

2.-XX:MaxGCPauseMillis

G1会尝试调整Young区的region数两来尽量满足这个值(动态调整比例)。

3.-XX:+G1HeapRegionSize 设置分区大小

G1 Region的大小只能是1M 2M 4M 8M 16M 32M,实际调优中,建议从小到大依次尝试设置并观察G1GC的效果。

RegionSize越大,垃圾对象的存活时间越长,GC间隔时间越长,停顿频率越低,但是也伴随着每次GC的时间都会更长,停顿时间更久的问题。

最新的ZGC已经做了改进,会动态调整区块的大小。

4.G1NewSizePercent 新生代最小比例

默认为5%。

5.G1MaxNewSizePercent 新生代最大比例

默认60%。

上述两个值可以调整,也就是G1的新生代和老年代内存大小比例是动态的,这是G1为了尽可能实现可预期的停顿模型做出的自动优化,一般不建议修改年轻代和老年代大小。

6.GCTimeRatio 时间建议比例

G1会根据这个值调整堆空间。

7.ConcGCThreads 并行线程数量

8.InitiatingHeapOccupancyPercent 启动G1堆空间占用比例

内存到底占用多大时开始G1回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值