Tomcat PermGen outOfMemory 问题排查

JVM 堆内存的组成部分

Java Memory Model

  • 堆内存 = 年轻代 + 年老代 + 永久代
  • 年轻代 = 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 内存最小值