JVM调优的方法有哪些?

JVM调优的主要方法有:

  1. 选择合适的垃圾回收器:根据应用场景选择高吞吐量或低延迟的垃圾回收器组合,平衡两者之间的关系。如吞吐量优先可以选择G1或PS + ParOld,低延迟可以选择CMS + Serial Old。
  2. 堆内存调优:设置合适的堆空间大小,一般将 maximum heap size 设置为物理内存的1/2到2/3。使用-Xms和-Xmx参数进行设置。
  3. 新生代与老生代大小比例:调大新生代,可以减少Full GC次数,提高吞吐量。设置-XX:NewRatio=4,新生代与老生代比例为1:4。
  4. PermGen空间调优:设置大的PermGen空间,避免因为类 metadata 溢出导致频繁Full GC。使用-XX:PermSize和-XX:MaxPermSize进行设置。
  5. 年轻代对象晋升阈值:设置较大的晋升阈值,让对象在新生代停留更长时间。使用-XX:MaxTenuringThreshold 设置,通常设置为15。
  6. 禁用Explicit GC:使用-XX:+DisableExplicitGC参数,禁止Java代码的System.gc()对吞吐量的影响。
  7. 线程栈大小:使用-Xss设置线程栈大小。一般将大小设置为512k到1M,设置过小会导致栈溢出,过大会减少可创建线程数。
  8. JIT编译器调优:使用-XX:CompileThreshold设置JIT编译的方法调用次数阈值。使用-XX:OnStackReplacePercentage设置OSR的百分比。
  9. 自适应调优策略:使用-XX:+UseAdaptiveSizePolicy启用JVM自适应调整各个区域的策略。
    例如,某个springboot应用,可以使用:
    -Xms2g -Xmx4g -XX:NewRatio=3 -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=15 -XX:+DisableExplicitGC -Xss1m -XX:CompileThreshold=500 -XX:OnStackReplacePercentage=10 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseAdaptiveSizePolicy
    这些参数综合考虑吞吐量、延迟、内存利用等方面,达到较好的调优效果。实践中需要不断调整与优化,总结经验,这也是JVM调优的重要内容。