Java虚拟机性能优化

mtain 2017年10月15日 673次浏览

Java虚拟机性能优化

1. JVM监控分析调优

1.1 Thread线程

**工具:**jstack
**说明:**线程卡住一般消耗CPU

步骤:

  1. top命令找出CPU使用率较高的进程的进程号PID
  2. 使用jstack工具导出此进程的所有线程数据jstack -l PID > thread_20171011_1500.txt
  3. 在生成的文件中查找"[STUCK]",即可定位到卡住的线程代码

查看进程中线程信息:

  1. 命令ps p 3036 -L -o pcpu,pid,tid,time,tname,cmd其中tid为线程号(十进制数)
  2. 线程号(十进制数)转十六进制printf "%x\n" TID

1.2 内存

**工具:**jmap(Memory Map),jhat(Java Heap Analysis Tool)
说明:

应用示例:

  1. 查看进程堆内存使用情况jmap -heap PID
  2. 查看堆内存中的对象数目,大小统计直方图jmap -histo PID|more
  3. 输出内存信息到dump文件jmap -dump:format=b,file=dumpFileName PID
  4. jhat查看dump文件jhat -port 9998 /tmp/dump.dat

注:

  1. Class name是对象类型
B  byte
C  char
D  double
F  float
I  int
J  long
Z  boolean
[  数组,如[I表示int[]
[L+类名 其他对象

1.3 JVM监控统计

**工具:**jstat
说明:

应用示例:

  1. 输出GC信息,时间间隔250ms,采样数20jstat -gc PID 250 20

注:

  1. GC信息各列含义
S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used)
EC、EU:Eden区容量和使用量
OC、OU:年老代容量和使用量
PC、PU:永久代容量和使用量
YGC、YGT:年轻代GC次数和GC耗时
FGC、FGCT:Full GC次数和Full GC耗时
GCT:GC总耗时
  1. GC等式
堆内存 = 年轻代 + 年老代 + 永久代
年轻代 = Eden区 + 两个Survivor区(From和To)

2. JVM参数配置

2.1 堆设置

-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:年轻代大小
-Xss:线程堆栈大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小

**注:**生产环境下初始堆内存和最大堆内存要设置为相等的数值-Xms1024m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=256m

2.2 收集器设置

-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器

2.4 并行收集器设置

-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

2.5 并发收集器设置

-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

2.3 垃圾回收统计信息

-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename

典型环境配置

  1. eclipse
-Xms1024m
-Xmx1024m
-XX:PermSize=256m
-XX:MaxPermSize=256m
-XX:+DisableExplicitGC
-Xnoclassgc
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=85
  1. Tomcat
JAVA_OPTS="-Xms512m -Xmx512m -XX:ParallelGCThreads=8 -XX:PermSize=128m -XX:MaxPermSize=256m

3 GC日志

3.1 GC日志开启

3.1.1 Tomcat

JAVA_OPTS='-server -Xms4g -Xmx4g -Xss256k -XX:PermSize=512m -XX:MaxPermSize=1024m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:$CATALINA_BASE/logs/gc.log -XX:OnOutOfMemoryError="kill -9 %p" -XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:InitiatingHeapOccupancyPercent=70'

3.1.2 Weblogic

export USER_MEM_ARGS="-Xms2048m -Xmx2048m  -XX:MaxPermSize=256m"
export JAVA_OPTIONS="${JAVA_OPTIONS} -Dweblogic.threadpool.MinPoolSize=100 -Dweblogic.threadpool.MaxPoolSize=500 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/var/logs/gc.log -XX:+HeapDumpOnOutOfMemoryError "

3.2 GC日志分析

5.617: [GC 5.617: [ParNew: 43296K->7006K(47808K), 0.0136826 secs] 44992K->8702K(252608K), 0.0137904 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]

5.617(时间戳): [GC(Young GC) 5.617(时间戳): [ParNew(GC的区域): 43296K(垃圾回收前的大小)->7006K(垃圾回收以后的大小)(47808K)(该区域总大小), 0.0136826 secs(回收时间)] 44992K(堆区垃圾回收前的大小)->8702K(堆区垃圾回收后的大小)(252608K)(堆区总大小), 0.0137904 secs(回收时间)] [Times: user=0.03(GC用户耗时) sys=0.00(GC系统耗时), real=0.02 secs(GC实际耗时)]

3.3 GC日志分析工具

**工具:**GCHisto,GCLogViewer

其它

1. 统计主机TCP状态

  1. 查看指定端口的连接数netstat -nat|grep -i "80"|wc -l