一、性能调优
性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等等。
架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。
二、何时进行JVM调优
遇到以下情况,就需要考虑进行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 >= 24小时。
注意:不同应用的JVM调优量化目标是不一样的。
六、JVM参数
JVM调优最重要的工具就是JVM参数。先来了解一下JVM参数相关内容。
-XX 参数被称为不稳定参数,**此类参数的设置很容易引起JVM性能上的差异,使 JVM 存在极大的不稳定性。**如果此类参数设置合理将大大提高JVM的性能及稳定性。
不稳定参数语法规则包含以下内容:
布尔类型参数值:
-XX:+ ‘+’表示启用该选项
-XX:- ‘-’表示关闭该选项
数字类型参数值:
XX: = 给选项设置一个数字类型值,可跟随单位,例如:‘m’或‘M’表示兆字节;‘k’或‘K’千字节;‘g’或‘G’千兆字节。32K与32768是相同大小的。
字符串类型参数值:
-XX: = 给选项设置一个字符串类型值,通常用于指定一个文件、路径或一系列命令列表。例如:-XX:HeapDumpPath=./dump.core