Linux jvm 分析

原因:tomcat下的应用跑了一段时间,应用访问特别慢

分析:

[root@yidong bin]# ps -ef | grep java
root       309 32447 20 10:16 pts/2    00:00:32 /usr/java/jdk1.6.0_37/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-6.0.36/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-6.0.36/endorsed -classpath /usr/local/apache-tomcat-6.0.36/bin/bootstrap.jar -Dcatalina.base=/usr/local/apache-tomcat-6.0.36 -Dcatalina.home=/usr/local/apache-tomcat-6.0.36 -Djava.io.tmpdir=/usr/local/apache-tomcat-6.0.36/temp org.apache.catalina.startup.Bootstrap start
root       519 32447  0 10:19 pts/2    00:00:00 grep java

根据第二列,获取进程的pid号(或者使用jps、jps -v、jps -l,直接获取到进程的pid)

[root@yidong bin]# jstat -gcutil 309
  S0     S1                E      O      P    YGC     YGCT    FGC    FGCT     GCT   
  0.00  99.72 100.00   4.57  99.97      5    0.088     0    0.000    0.088

第一行各个字母的意思:

S0  — Heap上的 Survivor space 0 区已使用空间的百分比
S1  — Heap上的 Survivor space 1 区已使用空间的百分比
E   — Heap上的 Eden space 区已使用空间的百分比
O   — Heap上的 Old space 区已使用空间的百分比
P   — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

每1000毫秒,打印一次,共打印5次,可以用:[root@yidong bin]# jstat -gcutil 309 1000 5

  S0     S1            E      O      P            YGC     YGCT    FGC    FGCT     GCT   
  0.00  99.56  66.25   6.01  99.79      7    0.085     0    0.000    0.085
  0.00  99.56  66.25   6.01  99.79      7    0.085     0    0.000    0.085
  0.00  99.56  66.25   6.01  99.79      7    0.085     0    0.000    0.085
  0.00  99.56  66.25   6.01  99.79      7    0.085     0    0.000    0.085
  0.00  99.56  66.25   6.01  99.79      7    0.085     0    0.000    0.085

 

经过以上分析,初步判定是 Perm space空间不足,需要在jvm启动的时候添加启动参数来解决。

 

linux下,在tomcat启动的Catalina.sh的注释下的首行,添加:

JAVA_OPTS="-Xms5120m -Xmx5120m -Xmn2048m -XX:PermSize=512m -XX:MaxPermSize=512m"

需要根据实际情况来设置,可以设置jvm堆栈和PermSize的大小。

 

通常运行命令如下:
jstat -gc 12538 5000
即会每5秒一次显示进程号为12538的java进成的GC情况,
显示内容如下图:
 

结果说明

显示内容说明如下(部分结果是通过其他其他参数显示的,暂不说明):
         S0C:年轻代中第一个survivor(幸存区)的容量 (字节) 
         S1C:年轻代中第二个survivor(幸存区)的容量 (字节) 
         S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节) 
         S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节) 
         EC:年轻代中Eden(伊甸园)的容量 (字节) 
         EU:年轻代中Eden(伊甸园)目前已使用空间 (字节) 
         OC:Old代的容量 (字节) 
         OU:Old代目前已使用空间 (字节) 
         PC:Perm(持久代)的容量 (字节) 
         PU:Perm(持久代)目前已使用空间 (字节) 
         YGC:从应用程序启动到采样时年轻代中gc次数 
         YGCT:从应用程序启动到采样时年轻代中gc所用时间(s) 
         FGC:从应用程序启动到采样时old代(全gc)gc次数 
         FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s) 
         GCT:从应用程序启动到采样时gc用的总时间(s) 
         NGCMN:年轻代(young)中初始化(最小)的大小 (字节) 
         NGCMX:年轻代(young)的最大容量 (字节) 
         NGC:年轻代(young)中当前的容量 (字节) 
         OGCMN:old代中初始化(最小)的大小 (字节) 
         OGCMX:old代的最大容量 (字节) 
         OGC:old代当前新生成的容量 (字节) 
         PGCMN:perm代中初始化(最小)的大小 (字节) 
         PGCMX:perm代的最大容量 (字节)   
         PGC:perm代当前新生成的容量 (字节) 
         S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 
         S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 
         E:年轻代中Eden(伊甸园)已使用的占当前容量百分比 
         O:old代已使用的占当前容量百分比 
         P:perm代已使用的占当前容量百分比 
         S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节) 
         S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节) 
         ECMX:年轻代中Eden(伊甸园)的最大容量 (字节) 
         DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满) 
         TT: 持有次数限制 
         MTT : 最大持有次数限制 

更多jstat的用法参见博客:http://www.51testing.com/?uid-77492-action-viewspace-itemid-203728

 

另外,使用jmap可以打印jvm的内存映射:

 jmap -histo 4939

 jmap -dump:format=b,file=test.bin 4939

jmap 导出的bin文件,可以用jhat来分析,方法是:jhat test.bin,然后会开启7000端口,访问http://localhost:7000端口,可以看到详细信息

 

posted @ 2018-05-18 17:38  十月围城小童鞋  阅读(220)  评论(0)    收藏  举报