Tomcat PermGen outOfMemory 问题排查
JVM 堆内存的组成部分
- 堆内存 = 年轻代 + 年老代 + 永久代
- 年轻代 = Eden区 + 两个Survivor区(From和To)
用 jstat 命令查看 JVM 资源占用情况
命令语法
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
jstat
命令实例
用 jps
命令查询 jvm 进程端口号
jps -J-Djava.io.tmpdir=/home/yrfz/apache-tomcat-7.0.39/temp/
用 jstat
命令查看内存占用
jstat -J-Djava.io.tmpdir=/home/yrfz/apache-tomcat-7.0.39/temp/ -gc 22685 1000 4
[root@AY1404091653014031c9Z bin]# jstat -J-Djava.io.tmpdir=/home/yrfz/apache-tomcat-7.0.39/temp/ -gc 22685 1000 4
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
192.0 192.0 0.0 32.0 164032.0 0.0 699072.0 184909.2 131072.0 131072.0 757 12.961 661 534.455 547.416
192.0 192.0 0.0 0.0 164288.0 0.0 699072.0 184911.1 131072.0 131072.0 758 12.968 662 535.259 548.227
192.0 192.0 0.0 0.0 164288.0 0.0 699072.0 184909.1 131072.0 131072.0 759 12.973 663 536.059 549.033
192.0 192.0 0.0 32.0 164544.0 0.0 699072.0 184909.1 131072.0 131072.0 761 12.985 665 537.653 550.638
各列意义:
- 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总耗时
发现内存不够怎么办?
修改配置文件,增加 jvm 内存。
在 apache-tomcat-x.x.xx/bin 目录下的 catalina.sh 添加:
JAVA_OPTS='-Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=1024m'
“m”表明单位是 MB,默认是 KB。
- -Xms:jvm 内存初始值
- -Xmx:jvm 内存最大值
- -Xmn:jvm 内存最小值