JVM内存泄露监控

JVM内存异常例子
[color=red][b]java.lang.OutOfMemoryError: PermGen space[/b][/color]

permanent space持久空间: 用于类和方法对象的存储。spring在AOP时使用CBLIB会动态产生很多类,JSP页面, Java反射类,当类太多,超过MaxPermSize的时候,就会抛出此异常。
参数问题可以设置jvm启动参数: PermSize, MaxPermSize。
如果是程序问题就要进行内存分析。

网上对Perm讨论的比较火热,有相当多的人认为这是JDK的一个至今未解决的BUG,因为Perm里存储的东西永远不会被JVM垃圾回收的,这个问题已经提出多年,但未得到SUN的解决。

[color=red][b]java.lang.OutOfMemoryError: Java heap space[/b][/color]

eden space使用率100%,总是被占满,参数问题可以设置jvm启动参数: Xms, Xmx。
如果是程序问题就要进行内存分析。

jdk里包括一个查看JVM状态的工具

jstat -gcutil pid号 1000 20

这里涉及到PID 关于pid 的查看 请查看我的 另外一篇 文章
[url]http://ldbjakyo.iteye.com/admin/blogs/759533[/url]

[table]
| 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
|
|
|
|参数含义:
|
|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:用于垃圾回收的总时间(单位秒) |
[/table]


[table]
| S0 S1 E O P YGC YGCT FGC FGCT GCT
|
| 0.00 0.00 99.99 82.51 53.11 2409 1.205 10117 7250.393 7251.598
|
| 0.00 0.00 83.42 82.55 53.10 2409 1.205 10118 7252.650 7253.855
|
| 0.00 0.00 56.06 82.46 53.10 2410 1.205 10120 7254.467 7255.672
|
| 0.00 0.00 32.11 82.55 53.10 2411 1.205 10121 7256.673 7257.877
|
| 0.00 0.00 99.99 82.55 53.10 2412 1.205 10123 7257.026 7258.231
|
| 0.00 0.00 76.00 82.50 53.10 2412 1.205 10124 7259.241 7260.446
|
|
|
|这个数据显示Full GC频繁发生。
|
| |
[/table]



[color=red][b] JDK自带的JVM查看分析工具jps、jmap、jstat、jconsole[/b][/color]


[color=red][b]jps[/b][/color]

Java进程查看工具,实际上它和Unix/Linux上面的ps命令的功能差不多


[color=red][b]jmap[/b][/color]

jmap是一个可以输出所有内存中对象的工具.

* -dump:format=b,file=<filename> 转存堆内存到本地文件。
* -histo 打印堆里每个类的情况,包含内存占用大小、对象数量及完整类名。VM的内部类以"*"开头。

例子:
jmap -histo pid号>log文件名

jmap -dump: file=a.hprof pid号


查看log文件

[table]
|Object Histogram:
|
|
|
|Size Count Class description
|
|-------------------------------------------------------
|
|21396040 135280 * ConstMethodKlass
|
|14231448 11002 * ConstantPoolKlass
|
|14076608 135280 * MethodKlass
|
|13120872 144660 char[]
|
|8795640 11002 * InstanceKlassKlass
|
|8070520 15045 byte[]
|
|8040592 147990 * SymbolKlass|
[/table]
[table]
|num #instances #bytes class name
|
|--------------------------------------
|
|1: 427398 14458448 [I
|
|2: 178798 6830216 [C
|
|3: 50278 6668512 <constMethodKlass>
|
|4: 179924 4318176 java.lang.String
|
|5: 50278 4026648 <methodKlass>
|
|6: 15244 3894200 [B
|
|7: 47809 1773776 [Ljava.lang.Object;
|
|...|
[/table]
#instance是对象的实例个数
#bytes是总占用的字节数
class name对应的就是Class文件里的class的标识
B代表byte
C代表char
D代表double
F代表float
I代表int
J代表long
Z代表boolean
前边有[代表数组,[I 就相当于int[]
对象用[L+类名表示

关于ConstMethodKlass

http://forums.sun.com/thread.jspa?threadID=760714
如果你看到ConstMethodKlass增加, ConstantPoolKlass等你载入“过度“数类(顺便说一句, ConstantPoolXXX对象用于存储有关ConstantPool的信息。class文件- 请参阅http://java.sun.com/docs / books/vmspec/2nd-edition/html/ConstantPool.doc.html 。同样, ConstMethodKlass存储方法的字节码等。) 。可能是因为您的应用程序加载的类地段(甚至可能是那些很多都是动态生成- 例如,JSP页面, Java反射类等)。一个可能的“修复“,就是要增加空间 MaxPermSize选项。


[color=red][b]jstat[/b][/color]

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



[color=red][b] jconsole[/b][/color]

一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。


[color=red][b]Dump出内存[/b][/color]

(1)Jconsole 打开后选择dumpHeap, 输入参数p0,p1;p0表示dump出来的文件路径,后缀为.hprof; p1设为true,表示只分析活着的对象。
[img]http://dl.iteye.com/upload/attachment/306226/7eab6a5f-589b-378a-a15d-1e098acd32a0.gif[/img]

(2)jmap -dump:file=a.hprof pid


其他内存分析工具

分析Java内存对象的工具,如收费的工具有jprofiler, 而像Eclipse MAT则是优秀的内存对象分析开源工具.它们对于分析内存溢出问题非常有用。以下是一个安装使用Eclipse MAT的简单例子。


(1)装一个Eclipse的内存分析插件MAT
http://download.eclipse.org/technology/mat/latest/update-site/


(2)切换到Memory Analysis模式

[img]http://dl.iteye.com/upload/attachment/306228/a1edcb44-d2ac-3998-a5d9-061049d0184d.gif[/img]


通过File > Open Heap Dump....查看dump出来的文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值