实例解析JVM内存监控流程

开发 后端
本文通过实例向大家介绍一下JVM内存监控的流程,由于在建项目的需要,监控tomcat的内存使用,检查内存泄漏的情况,相信你一定会感兴趣。

你对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. Map<String,Object>enviMap=newHashMap<String,Object>();  
  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启动参数中标准参数列表速查手册

 

责任编辑:佚名 来源: javaeye.com
相关推荐

2010-03-04 10:56:52

JVM参数

2012-03-02 14:20:46

JavaJVM

2010-09-25 12:54:24

JVM内存

2010-09-26 14:44:31

JVM内存监控工具

2023-08-24 07:46:21

服务器JVM

2010-09-27 11:00:27

TomcatJVM内存

2010-09-25 14:45:47

LinuxJVM

2010-02-22 08:58:35

JVM内存模型垃圾收集

2021-10-15 08:51:09

Linux内存 Kmalloc

2010-09-27 13:26:31

JVM内存管理机制

2009-07-09 18:03:25

tomcatJVM内存

2017-09-20 08:48:09

JVM内存结构

2012-01-11 10:45:57

JavaJVM

2021-07-30 07:22:51

JVM虚拟机栈 Stack

2021-04-16 20:40:56

JVM内存工具

2023-11-19 23:29:22

Heap DumpJava

2011-03-31 09:36:35

Cacti监控

2021-07-08 06:47:19

JVM监控工具

2010-09-27 15:39:37

JVM监控工具

2015-04-22 13:18:21

云智慧API监控
点赞
收藏

51CTO技术栈公众号