Tomcat8性能JVM优化

JVM性能调优:
Tomcat性能JVM优化,主要调堆内存空间和GC算法;
要求每次GC时间足够短,每段时间GC次数足够少;
常见 catalina.sh 配置修改如下:
JAVA_OPTS=“$JAVA_OPTS -server -Xms1024m -Xmx1024m -Xss256k -XX:+UseParallelOldGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heap_dump -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/tmp/heap_trace.txt -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MetaspaceSize=200m -XX:MaxMetaspaceSize=200m”

配置说明:
-Xms1024m #初始JVM堆大小1024M 一般堆内存使用1/4可用内存
-Xmx1024m #最大JVM堆大小1024M
-Xss256k #每个线程大小 一般256k
-XX:+UseParallelOldGC #设置并行年老代收集器
-XX:NewSize=256m -XX:MaxNewSize=256m #设置年轻代大小256 建议年轻代和年老代将根据默认的比例(1:4)分配堆内存
-XX:+HeapDumpOnOutOfMemoryError #可以控制JVM 在 OutOfMemoryError 时打印堆的信息
-XX:HeapDumpPath=/tmp/heap_dump #设置打印的位置
-XX:+PrintGCDetails #打印GC的详细信息
-XX:+PrintGCTimeStamps #打印GC的时间信息
-Xloggc:/tmp/heap_trace.txt #设置GC打印的日志名称
-XX:MetaspaceSize=200m -XX:MaxMetaspaceSize=200m #设置元空间 非堆内存 一般126-200M

堆内存设置
-Xms:初始JVM堆大小 一般堆内存使用1/4可用内存
-Xmx:最大JVM堆大小 一般堆内存使用1/4可用内存
-XX:NewSize=n 设置年轻代大小
-XX:NewRatio=3 #年轻代和年老代将根据默认的比例(1:4)分配堆内存
设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n #默认是8可以使用默认值
年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
年轻代又分为Eden和Survivor区。Survivor区由FromSpace和ToSpace组成。Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:1
-XX:NewSize=156m -XX:MaxNewSize=156m #设置年轻代堆大小 年轻代和年老代将根据默认的比例(1:4)分配堆内存

GC回收器设置
不同的GC回收器算法不一样,效率也不一样,主要看业务
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器

设置打Heap Dump信息
-XX:HeapDumpPath
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:/usr/aaa/dump/heap_trace.txt

问题一:
一个服务系统,经常出现卡顿,分析原因,发现Full GC时间太长
jstat -gcutil PID
S0 S1 E O P YGC YGCT FGC FGCT GCT
12.16 0.00 5.18 63.78 20.32 54 2.047 5 6.946 8.993
分析上面的数据,发现Young GC执行了54次,耗时2.047秒,每次Young GC耗时37ms,在正常范围,而Full GC执行了5次,耗时6.946秒,每次平均1.389s,数据显示出来的问题是:
Full GC耗时较长,分析该系统的是指发现,NewRatio=9,也就是说,新生代和老生代大小之比为1:9,
这就是问题的原因:新生代太小,导致对象提前进入老年代,触发老年代发生Full GC;
老年代较大,进行Full GC时耗时较大;
优化的方法是调整NewRatio的值,调整到4,发现Full GC没有再发生,只有Young GC在执行。这就是把对象控制在新生代就清理掉,
没有进入老年代(这种做法对一些应用是很有用的,但并不是对所有应用都要这么做;
Tomcat8性能JVM优化_第1张图片

你可能感兴趣的:(java虚拟机jvm,jvm)