`
liudaoru
  • 浏览: 1562493 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

判断java内存泄露的方式

    博客分类:
  • java
阅读更多

1、在jvm启动时加上:-agentlib:hprof=heap=sites,file=heap.txt  ,然后执行一段时间后执行 kill -3 <pid>,就可以获取jvm的内存镜像。类似的通过-agentlib:hprof=cpu=samples,file=cpu.txt查看cpu的状况。

2、先用jmap获取内存镜像:jmap -dump:live,format=b,file=/search/b.dat 5209,然后用jhat分析内存镜像:jhat  -J-Xmx4096m /search/b.dat 。之后通过7000端口访问,其中的Show heap histogram是展示堆中大内存的页面;

 

参考:http://hi.baidu.com/camaro/blog/item/384b31e9e7bae237b90e2d44.html

1
0
分享到:
评论
6 楼 liudaoru 2010-06-28  
jstat -gcutil 21984 10000
5 楼 liudaoru 2010-06-27  
weblogic内存占用等问题的解决方法
http://333111444.itpub.net/post/36621/481016
4 楼 liudaoru 2010-06-27  
http://guojuanjun.blog.51cto.com/277646/268611

JVM调优总结 -Xms -Xmx -Xmn -Xss
3 楼 liudaoru 2010-06-27  
http://my.oschina.net/javagg/blog/5056

实践性很强的一篇文章
2 楼 liudaoru 2009-10-14  
JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta
From: http://dolphin-ygj.iteye.com/blog/366216

JVM监控工具介绍
jstatd
启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。
实例:jstatd -J-Djava.security.policy=my.policy

my.policy文件需要自己建立,内如如下:
grant codebase "file:$JAVA_HOME/lib/tools.jar" {
permission java.security.AllPermission;
};
这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作

jps
列出所有的jvm实例
实例:
jps
列出本机所有的jvm实例

jps 192.168.0.77
列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099
(前提是远程服务器提供jstatd服务)

输出内容如下:
jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps
6286 Jps
6174  Jstat

jconsole
一个图形化界面,可以观察到java进程的gc,class,内存等信息。虽然比较直观,但是个人还是比较倾向于使用jstat命令(在最后一部分会对jstat作详细的介绍)。

jinfo(linux下特有)
观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数
实例:jinfo 2083
其中2083就是java进程id号,可以用jps得到这个id号。
输出内容太多了,不在这里一一列举,大家可以自己尝试这个命令。

jstack(linux下特有)
可以观察到jvm中当前所有线程的运行情况和线程当前状态
jstack 2083
输出内容如下:




jmap(linux下特有,也是很常用的一个命令)
观察运行中的jvm物理内存的占用情况。
参数如下:
-heap:打印jvm heap的情况
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live :同上,但是只答应存活对象的情况
-permstat:打印permanent generation heap情况

命令使用:
jmap -heap 2083
可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况
输出内容:




jmap -histo 2083 | jmap -histo:live 2083
可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。
输出内容:



写个脚本,可以很快把占用heap最大的对象找出来,对付内存泄漏特别有效。

jstat
最后要重点介绍下这个命令。
这是jdk命令中比较重要,也是相当实用的一个命令,可以观察到classloader,compiler,gc相关信息
具体参数如下:
-class:统计class loader行为信息
-compile:统计编译行为信息
-gc:统计jdk gc时heap信息
-gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况
-gccause:统计gc的情况,(同-gcutil)和引起gc的事件
-gcnew:统计gc时,新生代的情况
-gcnewcapacity:统计gc时,新生代heap容量
-gcold:统计gc时,老年区的情况
-gcoldcapacity:统计gc时,老年区heap容量
-gcpermcapacity:统计gc时,permanent区heap容量
-gcutil:统计gc时,heap情况
-printcompilation:不知道干什么的,一直没用过。

一般比较常用的几个参数是:
jstat -class 2083 1000 10 (每隔1秒监控一次,一共做10次)
输出内容含义如下:
Loaded Number of classes loaded.
Bytes Number of Kbytes loaded.
Unloaded Number of classes unloaded.
Bytes Number of Kbytes unloaded.
Time Time spent performing class load and unload operations.







jstat -gc 2083 2000 20(每隔2秒监控一次,共做10)
输出内容含义如下:
S0C Current survivor(存活的) space 0 capacity (KB).
EC Current eden space capacity (KB).
EU Eden space utilization (KB).
OC Current old space capacity (KB).
OU Old space utilization (KB).
PC Current permanent space capacity (KB).
PU Permanent space utilization (KB).
YGC Number of young generation GC Events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.



















输出内容:




监控内存使用情况 参数 (查看内存溢出相对有用)
jstat -gccause 2083 5000 (每隔5秒监控一次)
输出内容含义如下:


S0 Survivor space 0 utilization as a percentage of the space's current capacity.
S1 Survivor space 1 utilization as a percentage of the space's current capacity.
E Eden space utilization as a percentage of the space's current capacity.
O Old space utilization as a percentage of the space's current capacity.
P Permanent space utilization as a percentage of the space's current capacity.
YGC Number of young generation GC events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.
LGCC Cause of last Garbage Collection.
GCC Cause of current Garbage Collection.





















如果能熟练运用这些命令,尤其是在linux下,那么完全可以代替jprofile等监控工具了,谁让它收费呢。呵呵。
用命令的好处就是速度快,并且辅助于其他命令,比如grep gawk sed等,可以组装多种符合自己需求的工具。
1 楼 liudaoru 2009-09-08  
查看jvm内存状态:
jstat -gcutil 18630 1000 200

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

相关推荐

    理解和探查内存不足内存泄漏

    理解和探查内存不足内存泄漏 了解Java基本内存管理基本概念 了解发生内存不足/内存泄漏错误的原因和症状 了解如何诊断内存不足/内存泄漏错误 了解如何解决内存不足/内存泄漏错误

    JProfiler检查内存泄漏

    JProfiler是一款Java的性能监控工具。可以查看当前应用的对象、对象引用、内存、CPU使用情况、线程、线程运行情况(阻塞、等待等),同时可以查找应用内存使用得热点。

    java内存溢出

    为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放 问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 ...

    java通过Python命令执行datax任务调度

    1、通过java调用Python命令执行datax任务调度 2、自动开始任务和调度结束关闭...3、如果我们在cmd使用命令调度,执行完毕后无法释放内存,会造成内存泄露不足,出现报错“Error occurred during initialization of VM”

    常见的java面试题及解答

    在Java中,可以通过对可能为空的对象进行“非空判断”来避免空指针异常。例如,在使用一个对象之前,可以使用if语句检查该对象是否为null,如果为null,则可以抛出一个异常或者进行其他适当的处理。此外,也可以使用...

    Java垃圾回收知识,垃圾回收资料

    在Java面试中,垃圾回收(Garbage Collection)是一个非常重要的话题。下面是一份面试分析,以及垃圾回收在面试中的占比和重要性。 面试分析: 知识点覆盖范围:垃圾回收算法、垃圾收集...哪些情况下会导致内存泄漏?

    Java面试宝典2020修订版V1.0.1.doc

    43、什么是java内存泄漏,怎么预防? 85 七、框架部分 85 1、谈谈你对Struts2的理解。 85 2、谈谈你对Hibernate的理解。 86 3、你对Spring的理解。 87 4、Struts2优缺点 87 5、ORM工作原理? 89 6、struts2的核心...

    Java面试宝典-经典

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    Java面试宝典2010版

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    java面试题大全(2012版)

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    涵盖了90%以上的面试题

    内存泄漏和内存溢出 Java的内存模型(JVM的内存划分) JVM内存模型1.7和1.8的区别 如何判断一个对象是否是垃圾对象 垃圾回收算法 Minor GC和Full GC 垃圾收集器 集合的继承体系 Collection 和 Collections的区别。 ...

    最新Java面试宝典pdf版

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    Java经典入门教程pdf完整版

    Classloader能够加强代似的安全性,主要方式是:把本机上的类和內络资源类相分离, 在调入类的时候进行检查,因而可以限制任何“特洛伊木马”的应用。 4:字节码(byte-code)校验 功能是对 class文件的代码进行校验,保证...

    java面试宝典2012

    81、java中会存在内存泄漏吗,请简单描述。 59 82、能不能自己写个类,也叫java.lang.String? 62 83. Java代码查错 63 二. 算法与编程 67 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    Java面试笔试资料大全

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    JAVA面试宝典2010

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    Java面试宝典2012新版

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

Global site tag (gtag.js) - Google Analytics