实例解析JVM内存监控流程
创始人
2024-07-14 19:10:14
0

你对JVM内存监控是否熟悉,这里向大家简单描述一下,本文是亲自测试的详细配置过程,不是转载而且linux下不需修改/etc/hosts文件,其实JDK自身已经提供了很多工具,都在JAVA_HOME/bin/目录下:jvisualvm、jconsole、jstatd、jmap等等。

JVM内存监控流程

本文是亲自测试的详细配置过程,不是转载而且linux下不需修改/etc/hosts文件,由于在建项目的需要,监控tomcat的内存使用,检查内存泄漏的情况。其实JDK自身已经提供了很多工具,都在JAVA_HOME/bin/目录下:jvisualvm、jconsole、jstatd、jmap等等,以下为试验的环境配置:

client:vista、jdk1.6.0_18
server:linux、jdk1.6.0_02、tomcat6、IP:192.168.8.7

主要从下面三个方面描述JVM内存监控流程:

◆jmap(MemoryMap)JVM内存对象打印工具

◆jstatd配置

◆Tomcat配置JMX

一、用jmap获取数据查看JVM内存监控

JAVA_HOME/bin/jmap-histoPID
JAVA_HOME/bin/jmap-histoPID>hismem.txt
显示信息包括Java类、类实例对象数量、在内存中占有量的大小以及类的完整包名。

//将JVM内存堆的信息dump成为一个二进制文件,可供jstat、EclipseMAT内存分析工具来使用
JAVA_HOME/bin/jmap-dump:format=b,file=heap.binPID
EclipseMAT的分析工具:http://www.eclipse.org/mat/#p#

二:jstatd配置

需要在被JVM内存监控的服务器上面,通过jstatd来启动RMI服务。
新建个文件jstatd.all.policy文件内容如下:
Java代码 

  1. grantcodebase"file:${java.home}/../lib/tools.jar"{  
  2. permissionjava.security.AllPermission;  
  3. };    
  4.  

 启动命令如下:
Java代码 

  1. //默认端口为1099  
  2. jstatdjstatd-J-Djava.security.policy=jstatd.all.policy  
  3. //指定hostname一般情况需要重新指定hostname,否则连接不成功  
  4. jstatd-J-Djava.rmi.server.hostname=192.168.8.7  
  5. -J-Djava.security.policy=test/jstatd.all.policy  
  6. //指定hostname指定端口  
  7. jstatd-J-Djava.rmi.server.hostname=192.168.8.7  
  8. -J-Djava.security.policy=test/jstatd.all.policy-p8888  
  9. //启动JMX  
  10. jstatd-J-Djava.rmi.server.hostname=192.168.8.7  
  11. -J-Djava.security.policy=test/jstatd.all.policy  
  12. -J-Dcom.sun.management.jmxremote.port=8888 
  13. -J-Dcom.sun.management.jmxremote.ssl=false 
  14. -J-Dcom.sun.management.jmxremote.authenticate=false 
  15. //后台启动  
  16. nohupjstatd-J-Djava.rmi.server.hostname=192.168.8.7  
  17. -J-Djava.security.policy=test/jstatd.all.policy-p8888&  
  18.  
  19. //默认端口为1099  
  20. jstatdjstatd-J-Djava.security.policy=jstatd.all.policy  
  21. //指定hostname一般情况需要重新指定hostname,否则连接不成功  
  22. jstatd-J-Djava.rmi.server.hostname=192.168.8.7  
  23. -J-Djava.security.policy=test/jstatd.all.policy  
  24. //指定hostname指定端口  
  25. jstatd-J-Djava.rmi.server.hostname=192.168.8.7  
  26. -J-Djava.security.policy=test/jstatd.all.policy-p8888  
  27. //启动JMX  
  28. jstatd-J-Djava.rmi.server.hostname=192.168.8.7  
  29. -J-Djava.security.policy=test/jstatd.all.policy  
  30. -J-Dcom.sun.management.jmxremote.port=8888 
  31. -J-Dcom.sun.management.jmxremote.ssl=false 
  32. -J-Dcom.sun.management.jmxremote.authenticate=false 
  33. //后台启动  
  34. nohupjstatd-J-Djava.rmi.server.hostname=192.168.8.7  
  35. -J-Djava.security.policy=test/jstatd.all.policy-p8888&  

 启动通过:netstat-an|grep8888可以查看端口是否已经被监听,用JAVA_HOME/bin/jmap查看java进程:
Java代码 

  1. //查看本机的情况  
  2. jps  
  3. //查看远程计算机192.168.8.7的情况(默认1099端口)  
  4. jps192.168.8.7  
  5. //查看远程计算机192.168.8.78888端口  
  6. jpsrmi://192.168.8.7:8888  

 打开jvisualvm界面如下:

jvisualvm界面

右击远程选择添加远程主机:

添加远程主机

如果重新指定了jstatd端口,选择高级设置修改端口,如下图:

高级设置

如果同时配置了JMX,可以在添加JMX连接如下图:

添加JMX连接

添加后如图所示:

#p#

三:Tomcat配置JMX实现JVM内存监控

用hostname-i查看是否为127.0.0.1,这步非常重要,否则会连接失败,如果是,必须要配置-Djava.rmi.server.hostname比如我的配置为-Djava.rmi.server.hostname=192.168.8.7,而不需要修改hosts文件,修改此文件还可能影响到其他程序。
只需要在TOMCAT_HOME/bin/找到catalina.sh加上以下参数,重新启动tomcat就可以了:

Xml代码 

  1. JAVA_OPTS="$JAVA_OPTS-Djava.rmi.server.hostname=192.168.8.7  
  2. -Dcom.sun.management.jmxremote.port=8088 
  3. -Dcom.sun.management.jmxremote.ssl=false 
  4. -Dcom.sun.management.jmxremote.authenticate=false"  
  5.  
  6. JAVA_OPTS="$JAVA_OPTS-Djava.rmi.server.hostname=192.168.8.7  
  7. -Dcom.sun.management.jmxremote.port=8088 
  8. -Dcom.sun.management.jmxremote.ssl=false 
  9. -Dcom.sun.management.jmxremote.authenticate=false"  
  10.  

 打开JAVA_HOME/bin/下的jvisualvm或者jconsole的工具可以直接连接了,如下图visualvm连接的示意图:

visualvm连接的示意图

也可以写个Java类TestJMXClient.java测试下JMX连接是否成功:

Java代码 

  1. importjava.util.HashMap;  
  2. importjava.util.Map;  
  3.  
  4. importjavax.management.MBeanServerConnection;  
  5. importjavax.management.remote.JMXConnector;  
  6. importjavax.management.remote.JMXConnectorFactory;  
  7. importjavax.management.remote.JMXServiceURL;  
  8.  
  9. /**  
  10. *@authorMichael  
  11. */  
  12. publicclassTestJMXClient{  
  13.  
  14. /**  
  15. *@paramargs  
  16. */  
  17. publicstaticvoidmain(String[]args){  
  18. try{  
  19. StringjndiPath="jmxrmi";  
  20. Stringserverhost="192.168.8.7";  
  21. Stringserverport="8088";  
  22. //url=service:jmx:rmi:///jndi/rmi://192.168.8.7:8088/jmxrmi  
  23. Stringjmxurl="service:jmx:rmi:///jndi/rmi://"+serverhost+":"  
  24. +serverport+"/"+jndiPath;  
  25. System.out.println("jmxurl:"+jmxurl);  
  26. JMXServiceURLurl=newJMXServiceURL(jmxurl);  
  27. MapenviMap=newHashMap();  
  28.  
  29. JMXConnectorconnector=JMXConnectorFactory.connect(url,enviMap);  
  30.  
  31. MBeanServerConnectionmbsc=connector.getMBeanServerConnection();  
  32. System.out.println("successfulconnected");  
  33. connector.close();  
  34. System.out.println("closeconnect");  
  35. }catch(Exceptione){  
  36. System.out.println("error");  
  37. e.printStackTrace();  
  38. }  
  39. }  
  40. }  
  41.  

【编辑推荐】

  1. JVM内存调优设置原理
  2. 探究JVM1.6与JVM1.5性能差距
  3. JVM监控在本地和远程的应用
  4. 全面认识Eclipse中JVM内存设置
  5. JVM启动参数中标准参数列表速查手册

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...