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的用法參見博客: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端口,可以看到詳細信息

發佈了89 篇原創文章 · 獲贊 10 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章