一般来说,jvm的调优策略是没有一种固定的方法,只有依靠我们的知识和经验来对项目中出现的问题进行分析,正如吉德林法则那样当你已经把问题清楚写出来,就已经解决了一半。虽然JVM调优中没有固定的策略,但是本文会介绍几种比较常见的调优策略。
一、减少Full GC
项目中如果出现了Full GC,由于Full GC是清理整个堆空间包括年轻代和永久代,时间会很长,会大大的减少程序的性能。减少Full GC的频率策略可以参考
https://blog.csdn.net/qq_34939489/article/details/78133179
出现Full GC一般来说是项目中的大对象直接存入了老年代,老年代的内存不够,JVM触发Full GC。又因为堆内存设置较大,那么JVM回收的时间就会较长。
这样的话,就要考虑堆内存的设置,一般来说JVM的大小应该是物理内存的1/4(具体情况由项目来定),比如说你的物理内存是16G,那么你的堆内存最好设置为4G。如果服务器的内存过大,可以考虑配置多个web容器,利用nignx做单机的集群,每个堆内存配置相同(不超过物理内存的1/4),但是不能把所有的物理内存都分配出去,还需要留一部分作为本地内存。
二、内存溢出问题
内存溢出在项目中多多少少都会遇见,本文主要介绍使用了大量NIO情况下的内存溢出。一般来说,内存溢出首先就考虑的是加大堆内存,但是如果你的项目大量使用了NIO,这种做法非但没有效果,反而会增加内存溢出出现的概率。因为NIO使用时,会申请堆外内存(分配JVM内存后剩下的物理内存),如果说堆外内存较小,NIO处理量又较大,就会出现内存溢出情况。出现了这种情况如果说项目对物理内存需求不大且服务器的物理内存太小(能够满足项目需求),可以考虑减少堆内存。
其他的内存溢出问题,可以参考:https://blog.csdn.net/nocol123/article/details/76223098
三、处理不对等数据
处理不对等数据是指,如果项目系统的功能是接受其他系统发过来的数据,如果当发生端系统是多个系统时,而接受端只有一个,那么接受端系统和发送端系统的数据就不对等,这种情况就会导致jvm的性能崩溃(一般来说,jvm会链接重置),面对这种情况,优先考虑的是增加一个缓冲,如果是某个系统要接受其他多个系统的请求,可以考虑选择使用消息队列来出来。