java内存泄漏
一、图形化工具:jconsole
JDK自带,在windows平台下,执行cmd进入控制台,然后执行jconsole即可。
这个工具能够直观的观察内存的增长和回收情况,CPU的使用情况等等。
jconsole远程链接的一个实例,例如我想观察远端服务器上tomcat的运行情况。
1 vim catalina.sh 2 3 CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=192.168.8.100 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxrem 4 ote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
然后就可以在远程访问栏输入192.168.8.100:12345查看运行情况了。
上面配置的两个false是不用输入用户名和密码的。
作为产品发布时别忘记把这个注释掉!
二、jstat
jstat -gcutil 6728 2500 10
观察内存的回收情况,每隔2.5秒打印一次结果,一共打印10次,能看到类似下面的这个结果:
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 — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
如果有大量的FGC就要查询是否有内存泄漏的问题了!
三、如果想查看具体每一个类的内存分配情况怎么办呢?
一个强大的命令出场了:
jmap
查看每一个类的内存分配和占用情况:
jmap -heap 6728|jmap -histo:live 6728
上善若水,水利万物而不争。