GC调优详细说明

1. GC调优重要参数

生产环境推荐开启

-XX:+HeapDumpOnOutOfMemoryError
输出内存溢出文件
-XX:HeapDumpPath=D:/oomDump/dump.hprof
内存溢出文件保存位置,此文件用于MAT分析
当然,一般Linux服务器可以设置为 ./java_pid.hprof 默认为Java进程启动位置

调优之前开始,调优之后关闭

-XX:+PrintGC 调试跟踪之 打印简单的 GC 信息参数:
-XX:+PrintGCDetails和-XX:+PrintGCTimeStamps 打印详细的 GC 信息
-Xlogger:logpath:log/gc.log 设置 gc 的日志路,将 gc.log 的路径设置到当前目录的 log 目录下. 应用场景: 将 gc 的日志独立写入日志文件,将 GC 日志与系统业务日志进行了分离,方便开发人员进行追踪分析

考虑使用

-XX:+PrintHeapAtGC 打印推信息,获取 Heap 在每次垃圾回收前后的使用状况
-XX:+TraceClassLoading 在系统控制台信息中看到 class 加载的过程和具体的 class 信息,可用以分析类的加载顺序以及是否可进行精简操作
-XX:+DisableExplicitGC
禁止在运行期显式地调用 System.gc()

2. GC调优的原则(很重要)

大多数的 java 应用不需要 GC 调优
大部分需要 GC 调优的的,不是参数问题,是代码问题
在实际使用中,分析 GC 情况优化代码 比 优化 GC 参数 要多得多
GC 调优是最后的手段

调优的目的

GC 的时间够小
GC 的次数够少发生
Full GC 的周期足够的长,时间合理,最好是不发生
注: 如果满足下面的指标,则一般不需要进行 GC调优

Minor GC 执行时间不到 50ms
Minor GC 执行不频繁,约 10 秒一次
Full GC 执行时间不到 1s
Full GC 执行频率不算频繁,不低于 10 分钟 1 次

3. GC调优步骤

监控 GC 的状态使用各种 JVM 工具,查看当前日志,分析当前 JVM 参数设置,并且分析当前堆内存快照和 gc
日志,根据实际的各区域内存划分和 GC 执行时间,觉得是否进行优化。

分析结果,判断是否需要优化如果各项参数设置合理。

系统没有超时日志出现,GC 频率不高,GC 耗时不高,那么没有必要进行 GC 优化。 如果 GC 时间超过 1 秒,或者频繁
GC,则必须优化。

调整 GC 类型和内存分配如果内存分配过大或过小,或者采用的 GC 收集器比较慢,则应该优先调整这些参数,并且先找 1 台或几台机器进行
测试,然后比较优化过的机器和没有优化的机器的性能对比,并有针对性的做出最后选择。

不断的分析和调整通过不断的试验和试错,分析并找到最合适的参数5,全面应用参数如果找到了最合适的参数,则将这些参数应用到所有服务器,并进行后续跟踪。

分析GC日志
主要关注 MinorGC 和 FullGC 的回收效率(回收前大小和回收比较)、回收的时间。
1、-XX:+UseSerialGC

以参数-Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseSerialGC 为例详细说明。
[DefNew: 1855K->1855K(1856K), 0.0000148 secs][Tenured:
2815K->4095K(4096K), 0.0134819 secs] 4671K。
DefNew 指明了收集器类型,而且说明了收集发生在新生代。
1855K->1855K(1856K)表示,回收前 新生代占用 1855K,回收后占用 1855K,新生代大小 1856K
0.0000148 secs 表明新生代回收耗时。
Tenured 表明收集发生在老年代。
2815K->4095K(4096K), 0.0134819 secs:含义同新生代最后的 4671K 指明堆的大小。
2、-XX:+UseParNewGC

收集器参数变为-XX:+UseParNewGC。
日志变为:[ParNew: 1856K->1856K(1856K), 0.0000107 secs][Tenured:
2890K->4095K(4096K), 0.0121148 secs]。
收集器参数变为-XX:+ UseParallelGC 或 UseParallelOldGC。
日志变为:[PSYoungGen: 1024K->1022K(1536K)] [ParOldGen:
3783K->3782K(4096K)] 4807K->4804K(5632K)。
3、-XX:+UseConcMarkSweepGC 和 -XX:+UseG1GC
使用这两个收集器的日志会和UseParNewGC一样有明显的相关字样。

4. 项目启动调优

开启日志分析-XX:+PrintGCDetails,启动项目时,通过分析日志,不断地调整参数,减少GC次数。

例如:

碰到 Metadata空间 不足发生GC,那么调整 Metadata空间 -XX:MetaspaceSize=64m 减少 FullGC。
碰到MinorGC,那么调整堆空间 -Xms1000m 大小减少FullGC 。
如果还是有MinorGC,那么继续增大堆空间大小,或者增大新生代比例 -Xmn900m GC,此时新生代空间为900m,老年代大小100m 。

5. 推荐策略(仅作参考)

1、新生代大小选择

尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择).在此种情况下,新生代收集发生的频率也是最小的.同时,减少到达老年代的对象。
避免设置过小,当新生代设置过小时会导致:MinorGC 次数更加频繁、可能导致 MinorGC
对象直接进入老年代,如果此时老年代满了,会触发 FullGC。
2、老年代大小选择

一般吞吐量优先的应用都有一个很大的新生代和一个较小的老年代.原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而老年代尽存放长期存活对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值