JVM调优操作总结

一、GC日志收集

      最近一直在针对spring boot做一些JVM调优的工作,学习了很多人的思想,也有了一些自己的理解,这里将网上基本常见的调优选择罗列一些,主要目的是为了自己学习记录一下,也做一点分享,这里不谈理论,只说实际操作和参数的作用,具体需要针对自己的实际情况做出选择和调整。

1、GC日志参数

-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"。


二、JVM内存设置

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,新生代和老年代都可以收集,不会造成应用暂停,服务器内存高时推荐使用。

四、JVM调优工具

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



你可能感兴趣的:(JVM调优操作总结)