调试内存泄漏经验jps/jmap/jstat

工具:JDK5的jconsole(+调试内存泄漏经验介绍 jps/jmap/jstat)
2008-12-18 10:56

http://marshal.javaeye.com/blog/138879 jconsole工具介绍
Jconsole(Java Monitoring and Management Console)是从java5开始,在JDK中提供的java监控和管理控制台。用于对JVM中内存,线程和类等的监控。
基本配置
-本文使用java6,SUN JDK1.6.0_03,使用JDK1.5版本使用略有不同。
-本文使用windows XP。
-确认jdk的bin目录设置到环境变量Path中。
-在命令行中输入:【jconsole】。。。。如果弹出窗口,说明配置可用。
基本使用
这里使用的是本地JVM监控,如果要监控远程的JVM需要另外的配置
首先,启动需要监控的Java应用程序。
通过任务管理器的进程标签,查看该进程的PID,比如是1388
在命令行启动jconsole:【jconsole 1388
在启动的界面中:
-概述:有关堆内存使用情况,线程,类加载和CPU使用情况的综述;
-内存:内存的详细情况,堆和其他内存;
-线程:峰值/活动线程,另外,各个线程的明细信息,检测死锁;
-类:监控加载和卸载的类;
-vm摘要:有关vm的明细信息
-MBean:当前Java程序的MBean(如果有的话)的操作。
http://gq913.javaeye.com/blog/160979 tomcat中配置jconsole远程访问(附命令)
catalina.bat:
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port="9004" -Dcom.sun.management.jmxremote.authenticate="false" -Dcom.sun.management.jmxremote.ssl="false"
catalina.sh:
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
一些命令:
访问本地:
注意:如果启动的jconsole和JVM(Java)不是在同一个JDK目录下使用下面命令:jconsole pid
http://xsen.javaeye.com/blog/150317 配置jconsole远程监视 (jconsole Remote Monitoring)
环境:
服务器端: Linux + jdk1.5.0 + resin3 /客户端: Windows + jdk1.5.0
jconsole远程监视的配置步骤如下:
服务器端:
1. mkdir $JAVA_HOME/jconsole_pwd
2. cp $JAVA_HOME/jre/lib/management/jmxremote.password.template $JAVA_HOME/jconsole/jmxremote.password -> chmod 600 $JAVA_HOME/jconsole/jmxremote.password
3. vi jmxremote.password 去掉#monitorRole RED前的注释并将RED修改为你要设置的密码。(安全起见,只开放有只读权限的用户)

4. 修改 $RESIN_HOME/bin/wrapper.pl,为$JAVA_ARGS添加三个参数:
-Dcom.sun.management.jmxremote.port=1010
-Dcom.sun.management.jmxremote.password.file=/usr/local/jdk1.5.0/jconsole_pwd/jmxremote.password
-Dcom.sun.management.jmxremote.ssl=false
5. 执行hostname -i ,如果显示的是127.0.0.1,则需要修改/etc/hosts文件
6. vi /etc/hosts,修改如下:
#127.0.0.1              localhost localhost.localdomain localhost
服务器的真实IP地址        localhost localhost.localdomain localhost
具体原因是服务器端解释机器名的问题,相关问题见: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6209663
服务器端配置参见: http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#remote
7. 启动resi -> netstat -na|grep 1010 查看1010端口是否已在监听
客户端:
1. 打开cmd窗口,输入jconsole
2. 指定连接参数:
远程主机: 服务器的真实IP地址
端口: 1010 ($JAVA_ARGS中-Dcom.sun.management.jmxremote.port指定的端口)
用户名: monitorRole (jmxremote.password中指定的用户名)
密码: your_password(jmxremote.password中设置的密码)
3. 连接 -> OK。。。
客户端配置参见: http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html
jconsole文档地址:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jconsole.html

http://fly-hyp.javaeye.com/blog/300024 java调试内存泄漏经验介绍

修订记录:创建:2008年12月23日,修改:2008年12月24日 增加调试流程描述

今天要处理项目下的一个内存泄露的问题。使用了jprobe 工具,在测试环境反复调试不能发现问题的原因。最后使用jdk自带的jps jmap jstat 等工具顺利的查找到了内存泄露的原因。下面对jdk自带的jps jmap jstat工具总结介绍一下,希望以后同道中人google一下,找到这篇文章对大家有所帮助。尽量介绍的简明扼要,如果需要最详细的参考请翻阅jdk doc tools部分,如果有什么疑问请留言。
jps:
    相当于linux下的ps,列出所有java相关线程的pid等信息
    example:
       [tdwiki@installed-host-eth0 ~]$ jps  
       18861 Bootstrap
       1418 Jps
jmap:
    显示java进程内存使用的相关信息
   jmap pid                   打印内存使用的摘要信息
   jmap -histopid >mem.txt         打印比较简单的各个有多少个对象占了多少内存的信息,一般重定向的文件
jmap -dump:format=b,file= mem.dat pid        将内存使用的详细情况输出到mem.dat 文件
        用jhat命令可以参看 jhat -port 7000 mem.dat
        在浏览器中访问:http://127.0.0.1:7000/ 查看详细信息
jstat:
    显示java虚拟机的一些统计信息
   jstat -选项 pid 间隔显示时间显示次数
     jstat -gc 18861 250 10
   jstat -gccapacity 18861 250 10
   jstat -gcnew 18861 250 10
   jstat -gcnewcapacity 18861 250 10
   jstat -gcold 18861 250 10

我的调试流程

内存泄漏一般都是有一定特征的,任何代码和数据都要占用内存,我简单总结内存泄漏的特征是内存占用不可控制,GC不可回收。我追踪内存使用量的曲线发现一些特征,在估计虚拟机即将崩溃时,使用 jmap -histopid >mem.txt 发现相关内存泄漏的对象占用非常打比例的内存空间,然后很容易猜测问题大概的位置,一下子就解决了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值