调优的一些原则:

1.多数的java应用不需要再服务器上进行GC优化,虚拟机内部已经有很多优化来保证应用的稳定运行,不必为了调优而调优,不当调优可能适得其反。

2.在应用上线之前,先考虑将机器的JVM参数设置到最优。

3.在进行GC优化之前,需要确认项目的架构和代码等已经没有优化空间了。不能指望一个系统架构有缺陷或者代码层次没有优化好的应用,通过GC优化得到质的飞跃。

4.GC优化是一个系统而复杂的工作,没有万能的调优策略可以满足所有的性能指标。GC优化必须建立在我们深入理解各种垃圾回收器的基础上,才能事半功倍。

5.处理吞吐量和延迟问题时,垃圾处理器能使用的内存越大,即Java堆空间越大,垃圾收集效果越好,应用运行也越流畅,这称为GC内存最大化原则。

6.在这三个属性(吞吐量、延迟、内存)中选择其中两个进行JVM调优,称为GC调优三选二。

 

什么情况下需要调优

1.Heap内存(老年代)持续上涨达到设置的最大内存值。

2.Full GC次数频繁。

3.GC停顿(Stop World)时间过长(超过1秒,具体根据实际情况来定)。

4.应用出现OOM等内存异常。

5.应用出现OutOfDirectMemoryError等内存异常。

6.应用中有使用本地缓存且占用大量内存空间。

7.系统吞吐量与响应性能不高或下降。

8.应用的CPU占用过高或内存占用过高。

 

调优前需知的一些概念

1.吞吐量:用户代码执行时间/(用户代码执行时间 + 垃圾回收时间)。是评价垃圾收集器能力的重要指标之一,是不考虑垃圾收集引起的停顿时间或内存消耗,垃圾收集器能支撑应用程序达到的最高性能指标。吞吐量越高算法越好。

2.低延迟:STW越短,响应时间越好。是评价垃圾收集器能力的重要指标,度量标准是缩短由于垃圾收集引起的停顿时间或完全消除因垃圾收集引起的停顿,避免应用程序运行时发生抖动。暂停时间越短算法越好。

3.在设计或使用GC算法时,必须先确定目标:一个GC算法只能针对两个目标之一,最大吞吐量或最小暂停时间,或是二者的折衷。

4.MinorGC尽可能多的收集垃圾对象。我们把这个乘坐MinorGC原则,遵守这一原则可以降低应用程序FullGC的发生频率,FullGC比较耗时,是应用程序无法达到延迟要求或吞吐量要求的罪魁祸首。

5.堆大小调整的着手点,分析点:

(1)统计MinorGC持续时间。

(2)统计MinorGC的次数。

(3)统计FullGC的最长持续时间。

(4)统计最差情况下Full GC的频率。

(5)统计GC持续时间和频率对优化堆的大小是主要着手点。

(6)按照业务系统对延迟和吞吐量的需求,再按照这些分析,进行各个区大小的调整。

6.一般来说吞吐量优先的垃圾回收器:-XX:+UseParallelGC -XX:+UseParallelOldGC,即常规的PS/PO。

7.响应时间优先的垃圾回收器:CMS、G1。

 

JVM常用参数:JVM常用参数配置 - 知乎 (zhihu.com)

 

JVM性能调优工具:

1. MAT

2. jvisualvm

3. jconsole

4. Arthas

5. show-busy-java-thread

 

线上排查问题的一般流程

1.CPU占用过高排查流程

(1)利用top命令查出占CPU最高的进程的pid,例如pid=9876

(2)查看该进程下占用最高的线程id,命令:top -Hp 9876

(3)假设占用率最高的线程id为6900,将其转换为16进制 '0X1af4'

(4)利用jstack打印出java线程调用栈信息,命令: 就stack9876 | grep '0x1af4' -A 50 --color

 

2.内存占用过高排查流程

(1)查找进程id,命令:top -d 2 -c

(2)查看JVM堆内存分配情况,命令:jmap -heap pid

(3)查看占用内存比较多的对象,命令: jmap -histo pid | head -n 100

(4)查看占用内存比较多的存活对象,命令:jmap -histo:live pid | head -n 100

 

posted on 2021-11-19 15:39  Sempron2800+  阅读(77)  评论(0编辑  收藏  举报