探究JVM内存泄露
WEB服务总是莫名其妙的运行一段时间后JVM直接OutOfMemory错误,内存泄漏的问题不容易查找,本文就一些查找内存泄露基本知识做个总结,未涉及到具体案例的分析。
1 JVM内存异常的数据显示
1.1 java.lang.OutOfMemoryError: PermGen space异常的例子
Heap |
permanent space持久空间: 用于类和方法对象的存储。spring在AOP时使用CBLIB会动态产生很多类,当类太多,超过MaxPermSize的时候,就会抛出此异常。参数问题可以设置jvm启动参数: PermSize, MaxPermSize。程序问题就要进行内存分析了,详见下文。
1.2 java.lang.OutOfMemoryError: Java heap space异常的例子
Heap |
eden space使用率100%,总是被占满,参数问题可以设置jvm启动参数: Xms, Xmx。程序问题就要进行内存分析了,详见下文。
1.3 查看jvm内存状态:
jstat -gcutil pid 1000 20
异常情况的例子
jstat -gcutil pid 1000 20
S0 S1 E O P YGC YGCT FGC FGCT GCT |
这个数据显示Full GC频繁发生。 |
正常情况的例子
S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 0.00 0.24 55.39 99.60 171 0.667 1339 393.364 394.031 0.00 0.00 0.24 55.39 99.60 171 0.667 1339 393.364 394.031 0.00 0.00 0.24 55.39 99.60 171 0.667 1339 393.364 394.031 0.00 0.00 0.24 55.39 99.60 171 0.667 1339 393.364 394.031 0.00 0.00 0.24 55.39 99.60 171 0.667 1339 393.364 394.031 0.00 0.00 0.24 55.39 99.60 171 0.667 1339 393.364 394.031 |
参数含义: |
2 Dump出内存
2.1 找出要dump的线程pid
在windows下,使用tasklist |
在Linux下,使用ps –aux |
2.2 Dump出内存使用详情
可以通过命令:
jmap -dump:file=a.hprof pid |
也可以通过jconsole的图形界面操作。
在命令行键入:jconsole |
Jconsole 打开后在造作下选择dumpHeap, 输入参数p0,p1;p0表示dump出来的文件路径,后缀为.hprof; p1设为true,表示只分析活着的对象。
3 使用内存分析工具
目前有很多用来分析Java内存对象的工具,如收费的工具有jprofiler, 而像Eclipse MAT则是优秀的内存对象分析开源工具.它们对于分析内存溢出问题非常有用。以下是一个安装使用Eclipse MAT的简单例子。
3.1 装一个Eclipse的内存分析插件MAT
http://download.eclipse.org/technology/mat/latest/update-site/
3.2 切换到Memory Analysis模式
3.3 通过File > Open Heap Dump....查看dump出来的文件
4 JDK自带的JVM查看分析工具jps、jmap、jstat、jconsole
4.1 jps
Java进程查看工具,实际上它和Unix/Linux上面的ps命令的功能差不多
4.2 jmap
jmap是一个可以输出所有内存中对象的工具.
* -dump:format=b,file=<filename>
转存堆内存到本地文件。
* -histo 打印堆里每个类的情况,包含内存占用大小、对象数量及完整类名。VM的内部类以"*"开头。
例子:
jmap -histo pid>a.log |
jmap -dump: file=a.hprof pid |
查看a.log
num #instances #bytes class name |
说明: #instance是对象的实例个数 对象用[L+类名表示 |
4.3 jstat
jstat是vm的状态监控工具,监控的内容有类加载、运行时编译及GC。
使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。
jstat -class pid:显示加载class的数量,及所占空间等信息。
jstat -compiler pid:显示VM实时编译的数量等信息。
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young
gc的次数,young gc的时间,full gc的次数,full
gc的时间,gc的总时间。
jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推,
OC是old内纯的占用量。
jstat -gcnew pid:new对象的信息。
jstat -gcnewcapacity pid:new对象的信息及其占用量。
jstat -gcold pid:old对象的信息。
jstat -gcoldcapacity pid:old对象的信息及其占用量。
jstat -gcpermcapacity pid: perm对象的信息及其占用量。
jstat -util pid:统计gc信息统计。
jstat -printcompilation pid:当前VM执行的信息。
除了以上一个参数外,还可以同时加上
两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。
例子:
jstat -gcutil pid 1000 20 |
4.4 jconsole
一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。
转载:http://blog.****.net/winniepu/article/details/4934764
转载于:https://www.cnblogs.com/ajian005/archive/2011/05/30/2753839.html