最近一直在针对spring boot做一些JVM调优的工作,学习了很多人的思想,也有了一些自己的理解,这里将网上基本常见的调优选择罗列一些,主要目的是为了自己学习记录一下,也做一点分享,这里不谈理论,只说实际操作和参数的作用,具体需要针对自己的实际情况做出选择和调整。
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:D:\GClog\gc.log 日志文件的输出路径
2、GC日志参数配置位置
(1)执行JAR包直接配置JVM参数:java -Xloggc:D:\GClog\gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -jar speedtest.jar。
(2)Tomcat启动参数:CATALINA_OPTS='-XX:+UseConcMarkSweepGC -Xloggc:D:\GClog\gc.log'。
(3)weblogic在setDomainEnv.sh里面:JAVA_OPTIONS="-verbose:gc -Xverboselog:/home/weblogic/bea/gc.log"。
1、JAVA HEAP设置:-Xms -Xmx(例子:-Xms2048m -Xmx2048m),作为JVM参数跟GC日志参数配置位置一样。这个参数3-4倍的老年代内存。
2、永久代设置:
(1)1.8以前的JDK这样设置:-XX:PermSize=256m -XX:MaxPermSize=256m。
(2)JDK1.8以后变为了:-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m。这个一般推荐是老年代1.2-1.5倍。
3、年轻代设置:-Xmn1024m,这个推荐是老年代的1-1.5倍。
4、老年代=JAVA堆大小-年轻代大小
5、每一个线程的栈内存:-Xss256K(这个参数根据情况来说,不是越大越好,每个线程不应该占据太多内存,但是如果有很深的线程,就要考虑了,同时要考虑线程数多还是单个线程大的问题)
三、GC回收策略设置
1、Serial,开启配置-XX:+UseSerialGC,新生代收集器,串行收集器,默认设置,会有应用暂停,在小内存的时候表现不错,作为JVM参数跟GC日志参数配置位置一样。
2、SerialOld,开启配置-XX:+UseSerialGC,老年代收集器,单线程收集器。
3、ParNew,开启配置-XX:+UseParNewGC,新生代收集器,能并行的Serial收集器,可以与CMS配合。
4、ParallelScavenge,开启配置-XX:+UseParallelGC,新生代收集器,吞吐量优先收集器,应用停顿时间高,高峰性能好。
5、ParallelOld,开启配置-XX:+UseParallelOldGC,老年代收集器,老年代吞吐量优先收集器。
6、CMS,开启配置-XX:+UseConcMarkSweepGC,老年代收集器,并行,并且不会造成应用暂停,服务器内存高时推荐使用,一般用作商业服务器。
7、GarbageFirst(G1),开启配置–XX:+UseG1GC,新生代和老年代都可以收集,不会造成应用暂停,服务器内存高时推荐使用。
1、JCONSOLE,在JDK的bin下就有,可以检测的JVM的各类参数。
2、HSDB,可以检测jvm内存走向,启动命令java -cp "D:\Program Files\Java\jdk1.8.0_74\lib\sa-jdi.jar" sun.jvm.hotspot.HSDB。
参考文章:
http://swcdxd.iteye.com/blog/1859858
https://zhuanlan.zhihu.com/p/25539690
作者github地址:https://github.com/cyc3552637