jvm调试工具类使用 (jvisualvm.exe)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm调试工具类使用 (jvisualvm.exe)相关的知识,希望对你有一定的参考价值。

参考技术A

目标: 使用JDK自带的JVM监测工具调试内存使用情况及堆栈问题排查

简要说明: 在实际项目开发过程中,如果使用多线程,但是没有控制好线程数量的情况下,就会出现堆内存溢出问题,导致功能服务宕机,如果严重很可能导致服务器宕机问题。当出现内存溢出时,只能看到简单的内存溢出日志,排查问题毫无头绪,不知道哪里线程出现问题,这样就很难解决问题;
这时我们就可以通过JDK自带的JVM监控工具查看每个线程的生命周期以及相关源码追溯,这样就可以清楚明了的看清问题出现在哪里,然后根据实际情况解决问题;

通过上图可以看到本地服务中所有的线程及相关状态,如果线程出现问题需要排查时,需要查看具体执行的方法,那么就需要快照方式查看,具体方式如下:

点击抽样器,然后选择CPU抽样,点击停止,在点击下面的快照按钮,就可以获取所有所有线程的一次快照,然后就可以看到每个线程执行的源码,具体操作如下图:

通过上述的操作即可查看线程具体涉及的源码,从而排查问题!

上面说的是本地服务监测,但是有很多情况本地服务是排查不到问题的,只有在服务器上面才能看出问题,那么我们就需要远程连接服务器上面服务,进行监控,查看具体线程的运行情况及源码分析

远程配置需要在启动Java服务的时候,在启动命令上面添加指定启动参数,这里提供的命令是正常情况下完整的启动jar包的命令,具体命令参数也很清楚,命令如下:

ps:port是监控所需的端口,也就是启动服务指定的端口,但是端口要对外开放,一般的普通服务端口是不会对完开放的,这一点需要注意
hostname是对应监控的ip,我这里用的就是服务器ip,如果连接不上的情况下,可以尝试使用 hostname -i 获取的对应ip,具体情况具体分析

然后启动服务之后,选中远程右键添加远程主机,输入远程主机ip后确定即可,然后选择主机ip,右键添加JMX连接,输入设定的端口号,点击确定即可,然后就可以监控远程服务器了,接下来的查看线程的情况、监控服务情况及排查问题使用快照,就和上面本地的操作一样了!

经过上述操作就可以通过JDK自带的监控软件,进行监控Java程序的运行情况以及服务器的运行情况啦!

本人原著,如有问题欢迎大家指正,共同进步!

jvisualvm远程监控Tomcat

一.Java VisualVM 概述

   对于使用命令行远程监控jvm 太麻烦 。 在jdk1.6 中 Oracle 提供了一个新的可视化的。 JVM 监控工具 Java VisualVM 。jvisualvm.exe 在JDK 的 bin 目录下。

   双击启动 Java VisualVM 后可以看到窗口左侧 “应用程序 ”栏中有“ 本地 ”、“远程 ” 、“快照 ”三个项目。 

  “本地 ”下显示的是在 localhost 运行的 Java 程序的资源占用情况,如果本地有 Java 程序在运行的话启动 Java VisualVM 即可看到相应的程序名,点击程序名打开相应的资源监控菜单,以图形的形式列出程序所占用的 CPU 、 Heap 、 PermGen 、类、线程的 统计信息。 

  “远程” 项下列出的远程主机上的 Java 程序的资源占用情况,但需要在远程主机上运行 jstatd 守护程序 

 

VisualVM分为 3 类, 本地 它会自动侦测到,并显示出来 

双击Local 下的任一节点,看到右边的变化 ,你可以监控 CPU ,内存,类,线程等运行状况,实时监控服务器性能。 

  右键 VisualVM我们可以看到 Thread Dump, Heap Dump

 做 Thread Dump 很快,马上就可以看到结果

 

 

Heap Dump要稍花费一些时间(可以看到当前 heap 里对象的数量及占用的比例,做 OOM 很好用)

 

 

 

对其功能不再做描述,可以查阅网上相关质量,我们主要讲的是如何使用 VisualVM 远程监控。

 

二.使用visualvm 远程监控 JVM  

1. 测试环境

Ubuntu 16.04LTS

 

2.  在服务器上安装 jstatd 组件

安装jdk1.7 :

 

3. 在服务器上配置 jstatd 的 security policy 文件 

   jstatd是一个监控 JVM 从创建到销毁过程中资源占用情况并提供远程监控接口的 RMI ( Remote Method Invocation ,远程方法调用)服务器程序,它是一个 Daemon 程序,要保证远程监控软件连接到本地的话需要 jstatd 始终保持运行。 

   jstatd运行需要通过 -J-Djava.security.policy=*** 指定安全策略,因此我们需要在服务器上建立一个指定安全策略的文件jstatd.all.policy ,文件内容如下: 

Java代码  收藏代码
  1. grant codebase "file:${java.home}/../lib/tools.jar" {  
  2.    permission java.security.AllPermission;  
  3. };  

 

 

4. 修改服务器 hosts 文件中的 IP 地址 

   要使Java VisualVM 成功连接到远程服务器上,服务器端应该在 /etc/hosts 文件中把本机地址设为本机的 IP 地址。使用 hostname -i 命令查看,如果显示的是 127.0.0.1 或者与本机实际 IP 不一致的话,需要把 /etc/hosts 文件中相应的地址改为本机实际 IP 。

   127.0.0.1 主机名

 改为

 本机ip 主机名

   再用 hostname -i检查

5. 运行 jstatd 守护程序 

 命令如下

sudo jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=本机IP &

 

如果需要RMI 日志功能的话,还可以在启动参数中加入 -J-Djava.rmi.server.logCalls=true 。

Java代码  收藏代码
  1. screen jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=true  

 

 

jstatd开始运行后,使用 CTRL+A+D 断开 screen 界面,回到 shell 界面。如果想切换回 jstatd 运行界面的话,使用 screen -r -d命令即可。

 

6. 通过Java VisualVM 连接到服务器监控 Java 程序

   在Java VisualVM 程序窗口左侧 “ 远程 ” 项目右键选择 “ 添加远程主机 ” ,在弹出的对话框中输入远程主机的 IP 地址,确认提交后即可看到相应的远程主机和在上面运行的 Java 程序,连接成功后应该会显示 Jstatd 及其 PID 。

 

 

 

  通过以上方式连接服务器发现一个问题,不能监控CPU 。提示我们建立 JMX ,建立 JMX 提示要求端口号。( JMX:Java Management Extensions ,即 Java 管理扩展 , 是一个为应用程序、设备、系统等植入管理功能的框架。 JMX 可以跨越一系列异构操作系统平台、系统体系结构和 网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用 。而 Visual VM是通过 JMX 来和远程 Java 应用联系的 )。  

7. Tomcat中配置

  下面我们为211 服务器的 tomcat 配置 jvm 启动参数。 在 tomcat 的 catalina.sh 中添加如下参数:

Java代码  收藏代码
  1. JAVA_OPTS=\'-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false\'   

 

或:

Java代码  收藏代码
  1. JAVA_OPTS=’-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.54  其他配置’  

 

 

 

注:1. -Dcom.sun.management.jmxremote.port :这个是配置远程 connection 的端口号的,要确定这个端口没有被占用

2. -Dcom.sun.management.jmxremote.ssl=false 指定了 JMX 是否启用 ssl

3. -Dcom.sun.management.jmxremote.authenticate=false   指定了JMX 是否启用鉴权(需要用户名,密码鉴权)

   2,3两个是固定配置,是 JMX 的远程服务权限的

4. -Djava.rmi.server.hostname :这个是配置 server 的 IP 的 

 

连接成功,现在我们可以远程监控服务器性能,可以配合 jmeter 进行了一个长时间的加压,在加压过程中重点关注了系统资源的使用情况。

 

 

三.参考博客

http://ihuangweiwei.iteye.com/blog/1219302

以上是关于jvm调试工具类使用 (jvisualvm.exe)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用JDK自带jvisualvm监控工具

JDK自带的线程监视工具jvisualvm

jvisualvm远程监控Tomcat

Spark(五十):使用JvisualVM监控Spark Executor JVM

JVM监控hive进程

java heap space以及jvisualvm.exe 工具