JVM调优和了解性能优化

目录

1、JVM调优的本质:

2、GC调优原则

3、GC满足以下几个指标,一般不需要GC

4、GC调优步骤

4.1 监控 GC 的状态

4.2 分析结果,判断是否需要优化

4.3 调整 GC 类型和内存分配

4.4 不断的分析和调整

4.5 全面应用参数

4.5.1 -XX:+UseSerialGC --串行回收器进行回收

4.5.2 -XX:+UseParNewGC -- ParNew收集器是Serial收集器的多线程版本

4.5.3 -XX:+UseConcMarkSweepGC

4.5.4 -XX:+UseG1GC

4.6 项目启动GC调优

5、调优推荐策略

5.1 新生代大小选择

5.2 老年代大小选择


1、JVM调优的本质:

1.1不是为了提高性能,是为了稳定性,不是说调了性能就会提升几倍或者几十倍;

1.2 如果系统频繁的出现GC,这个时候系统是不稳定的,这时需要进行JVM调优;

2、GC调优原则

2.1 大多数的 java 应用不需要 GC 调优

2.2 大部分需要 GC 调优的的,不是参数问题,是代码问题

2.3 在实际使用中,分析 GC 情况优化代码比优化 GC 参数要多得多;

2.4 GC 调优是最后的手段

3、GC满足以下几个指标,一般不需要GC

Minor GC 执行时间不到 50ms;

Minor GC 执行不频繁,约 10 秒一次;

Full GC 执行时间不到 1s;

Full GC 执行频率不算频繁,不低于 10 分钟一次。

4、GC调优步骤

(1)日志分析:

4.1 监控 GC 的状态

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

4.2 分析结果,判断是否需要优化

如果各项参数设置合理,系统没有超时日志出现,GC 频率不高,GC 耗时不高,那么没有必要进行 GC 优化;如果 GC 时间超过 1-3 秒,或者频繁 GC,则必须优化

4.3 调整 GC 类型和内存分配

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

4.4 不断的分析和调整

通过不断的试验和试错,分析并找到最合适的参数

4.5 全面应用参数

如果找到了最合适的参数,则将这些参数应用到所有服务器,并进行后续跟踪。

(2)阅读GC日志:

主要关注 MinorGC(Young GC/新生代) 和 FullGC(老年代) 的回收效率(回收前大小和回收比较)、回收的时间。

4.5.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 指明堆的大小。

4.5.2 -XX:+UseParNewGC -- ParNew收集器是Serial收集器的多线程版本

注:新生代使用ParNew,老年代使用Serial Old

收集器参数变为-XX:+UseParNewGC,日志变为:

[ParNew: 1856K->1856K(1856K), 0.0000107 secs][Tenured: 2890K->4095K(4096K), 0.0121148 secs]

收集器参数变为-XX:+ UseParallelGC 或 UseParallelOldGC,日志变为:

注:新生代使用 ParallerGC,老年代使用 Serial Old

[PSYoungGen: 1024K->1022K(1536K)] [ParOldGen: 3783K->3782K(4096K)] 4807K->4804K(5632K)

4.5.3 -XX:+UseConcMarkSweepGC

CMS 收集器和 G1 收集器会有明显的相关字样

4.5.4 -XX:+UseG1GC

4.6 项目启动GC调优

1、 开启日志分析 -XX:+PrintGCDetails 发现有多次 GC 包括 FullGC

2、 调整 Metadata 空间 -XX:MetaspaceSize=64m 减少 FullGC

3、 减少 Minor gc 次数,增加参数 -Xms500m GC 减少次数

4、 再次减少 Minor gc 次数,调整参数 -Xms1000m GC 减少至 2 次

5、 增加新生代比重,增加参数 -Xmn900m GC 减少至 1 次

6、 加大新生代,调整参数 -Xms2000m -Xmn1800m 还是避免不了 GC,没有必要调整这么大

5、调优推荐策略

5.1 新生代大小选择

· 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择).在此种情况下,新生代收集发生的频率也是最小 的.同时,减少到达老年代的对象.

· 吞吐量优先的应用:尽可能的设置大,可能到达 Gbit 的程度.因为对响应时间没有要求,垃圾收集可以并行进行,一般适合 8CPU 以上的应用.

· 避免设置过小.当新生代设置过小时会导致:

1.MinorGC 次数更加频繁

2.可能导致 MinorGC 对象直接进入老年代,如果此时老年代满了,会触 发 FullGC.

5.2 老年代大小选择

响应时间优先的应用:老年代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数.如果堆设置小了,可 以会造成内存碎 片,高回收频率以及应用暂停而使用传统的标记清除方式; 如果堆大了,则需要较长的收集时间.最优化的方案,一般需要参考以下数据获得: 并发垃圾收集信息、持久代并发收集次数、传统 GC 信息、花在新生代和老年代回收上的时间比例。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值