简单的JVM调优
8
1更健康
堆中三个区域:Eden、From Survivor、To Survivor。从图中可以也可以看到它们的大小比例,准确来说是:81
JVM参数参数" class="reference-link">
JVM参数参数
控制参数详解:
- Xms设置堆的最小空间大小。
- Xmx设置堆的最大空间大小。
- Xmn堆中新生代初始及最大大小(NewSize和MaxNewSize为其细化)。
- XX:NewSize设置新生代最小空间大小。
- XX:MaxNewSize设置新生代最大空间大小。
- XX:PermSize设置永久代最小空间大小。
- XX:MaxPermSize设置永久代最大空间大小。
- Xss设置每个线程的堆栈大小。
什么情况进行调优
遇到以下情况,就需要考虑进行JVM调优了:
- Heap内存(
老年代)持续上涨
达到设置的最大内存值; Full GC 次数频繁
;GC 停顿时间过长
(超过1秒);- 应用出现
OutOfMemory
等内存异常; - 应用中有使用本地缓存且占用大量内存空间;
- 系统吞吐量与响应性能不高或下降。
- JVM调优的基本原则
- JVM调优是一个手段,但并不一定所有问题都可以通过JVM进行调优解决,
因此,在进行JVM调优时,我们要遵循一些原则:
- 大多数的Java应用不需要进行JVM优化;
- 大多数导致GC问题的原因是
代码层面的问题导致的
(代码层面); - 上线之前,应先考虑将机器的
JVM参数设置到最优
; 减少创建对象的数量
(代码层面);减少使用全局变量和大对象
(代码层面);- 优先架构调优和代码调优,JVM优化是不得已的手段(代码、架构层面);
- 分析GC情况优化代码比优化JVM参数更好(代码层面);
通过以上原则,我们发现,其实最有效的优化手段是架构和代码层面的优化,而JVM优化则是最后不得已的手段,也可以说是对服务器配置的最后一次“压榨”。
JVM调优目标
调优的最终目的都是为了令应用程序使用最小的硬件消耗来承载更大的吞吐。jvm调优主要是针对垃圾收集器的收集性能优化,令运行在虚拟机上的应用能够使用更少的内存以及延迟获取更大的吞吐量。
- 延迟:GC低停顿和GC低频率;
- 低内存占用;
- 高吞吐量;
其中,任何一个属性性能的提高,几乎都是以牺牲其他属性性能的损为代价的,不可兼得。具体根据在业务中的重要性确定。
JVM调优量化目标
下面展示了一些JVM调优的量化目标参考实例:
- Heap 内存使用率 <= 70%;
- Old generation内存使用率<= 70%;
- avgpause <= 1秒;
- Full gc 次数0 或 avg pause interval(stw) >= 24小时 ;
注意:不同应用的JVM调优量化目标是不一样的。
JVM调优的步骤
一般情况下,JVM调优可通过以下步骤进行:
- 分析GC日志及dump文件,判断是否需要优化,确定瓶颈问题点;
- 确定JVM调优量化目标;
- 确定JVM调优参数(根据历史JVM参数来调整);
- 依次调优内存、延迟、吞吐量等指标;
- 对比观察调优前后的差异;
- 不断的分析和调整,直到找到合适的JVM参数配置;
- 找到最合适的参数,将这些参数应用到所有服务器,并进行后续跟踪。
- 以上操作步骤中,某些步骤是需要多次不断迭代完成的。一般是从满足程序的内存使用需求开始的,之后是时间延迟的要求,最后才是吞吐量的要求,要基于这个步骤来不断优化,每一个步骤都是进行下一步的基础,不可逆行之。
GC垃圾回收器
JDK1.8 使用默认参数的java应用使用的GC组合是
Parallel Scavenge (新生代) 和 Parallel Old (老年代)
新生代(别名) | 老年代 | JVM 参数 |
---|---|---|
Serial (DefNew) | Serial Old(PSOldGen) | -XX:+UseSerialGC |
Parallel Scavenge (PSYoungGen) | Serial Old(PSOldGen) | -XX:+UseParallelGC |
Parallel Scavenge (PSYoungGen) | Parallel Old (ParOldGen) | -XX:+UseParallelOldGC |
ParNew (ParNew) | Serial Old(PSOldGen) | -XX:-UseParNewGC |
ParNew (ParNew) | CMS+Serial Old(PSOldGen) | -XX:+UseConcMarkSweepGC |
G1 | G1 | -XX:+UseG1GC |
优化的重点
举个栗子" class="reference-link">
举个栗子
优化前:
优化后:
伊甸园和新生代保持81
总结" class="reference-link">
总结
业务预估,参数设置,年轻代提早干掉,不去到老年代。尽量触发minor GC,但不触发Full GC,不触发STW否则会有卡顿。
还没有评论,来说两句吧...