使用Visual VM 查看linux中tomcat运行时JVM内存

时间:2023-03-15 12:32:14

前言:在生产环境中经常发生服务器内存溢出,假死或者线程死锁等异常,导致服务不可用。我们经常使用的解决方法是通过分析错误日记,然后去寻找代码到底哪里出现了问题,这样的方式也许会奏效,但是排查起来耗费时间比较多,或者说本身代码本身就没有错,而是访问量大时候消耗内存太多,垃圾对象没有及时回收等等其他情况导致的,这样排查异常起来异常困难,那么有没有一些可视化的工具,帮助我们可以详细地查看当前应用服务的内存情况,从而为我们在解决异常、优化代码、优化服务等方面提供一些建议呢?幸好,jdk为我们免费提供一个这样的可视化工具,VisualVM,当然市场上还有一些商业或免费的其他类似工具,如JProfiler、JConsole等。下面我就介绍介绍,如何在window环境下,使用Visual VM连接Linux环境上的部署在tomcat上的web应用。

1、环境准备和说明
      win7
      jdk1.6.0_31
      tomcat6
      linux centos
  本地的VisualVM要连接远程的JVM,需要进行相关的配置,VisualVM主要是通过JMX和jstatd两种方式进行远程连接的。
  JMX连接可以查看系统信息,CPU使用情况,线程多少时间轴,手动执行垃圾回收等比较偏于系统级层面的信息。
   jstatd连接方式可以提供JVM内存分布详细信息,垃圾回收分布图、线程详细信息,甚至可以看到某个对象使用内存的大小。
因此想查看远程的JVM的具体信息,最好两种方式都进行配置连接。

2、JMX连接的配置

在tomcat的bin/startup.sh中的末尾加入如下配置,这样该tomcat下 的web应用都可以通过VisualVM的JMX方式连接

export CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote=true
-Djava.rmi.server.hostname=19.129.251.16
-Dcom.sun.management.jmxremote.port=8099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

hostname:tomcat所在的Linux服务器的地址
port:暴露的访问端口,不能和其他端口重复
添加后的效果图:
使用Visual VM 查看linux中tomcat运行时JVM内存

配置完毕后启动tomcat,看能不能访问上面配置的地址10.5.227.81:8999
使用Visual VM 查看linux中tomcat运行时JVM内存
使用telnet成功,说明地址是可以访问的,如果不能,则需要排查网络环境
  a、远程Linux服务器的地址10.5.227.81和你的机器的联通性,使用ping命令看通不通
  b、查看防火墙的是否限制了该端口的访问

如果上述步骤没有出现问题,那么你已经接近成功一大半
接下来在本地机器上打开jdk/bin/jvisualvm.exe,如图是visual VM的开始页面
使用Visual VM 查看linux中tomcat运行时JVM内存

新建一个远程连接,”远程”右键–>”添加远程主机”,输入上述配置的服务器地址,Djava.rmi.server.hostname=10.5.227.81

使用Visual VM 查看linux中tomcat运行时JVM内存

选择添加的主机,右键–>”添加JMX连接”,输入上面配置的端口8999,-Dcom.sun.management.jmxremote.port=8999

使用Visual VM 查看linux中tomcat运行时JVM内存

JMX连接成功后,你已经可以查看JVM的参数,如堆栈大小等JVM相关参数,查看服务器cpu消耗情况,手动执行垃圾回收、导出堆dump镜像,查看类、线程的总数和分布情况等权限
使用Visual VM 查看linux中tomcat运行时JVM内存

使用Visual VM 查看linux中tomcat运行时JVM内存

3、jstatd连接的配置
  如果想看看jvm的内存各个分区的使用情况,哪些线程,变量使用内存的详细情况,还需要建立jstatd连接。在tomcat下(或者某个路径下,下面用到时指定绝对路径就行)新建文件jstatd.java.policy,该文件主要是用于授予VisualVM远程连接的权限,里面内容如下

   grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
  • 1
  • 2
  • 3

创建jstatd.java.policy 后的效果图如下:
使用Visual VM 查看linux中tomcat运行时JVM内存

在Linux服务窗口执行下面命令

[root@qgserver ~]# jstatd -J-Djava.rmi.server.hostname=10.5.227.81  -J-Djava.security.policy=/data/tomcat6-fssmyx/jstatd.java.policy 
  • 1

10.5.227.81是Linux服务器的ip地址,同上面。
jstatd.java.policy就是上面建立的文件,注意要指定绝对路径,我的是放在/data/tomcat6-fssmyx/,根据实际情况配置。

执行成功后,Visual VM中自动建立的jstatd连接,可以看到这台机上所有的tomcat,找到自己需要查看的tomcat web服务
使用Visual VM 查看linux中tomcat运行时JVM内存

打开VIsual GC选项卡可以看到tomcat的内存使用分布图,永久区、老年代、新生代的使用情况、垃圾回收的信息。要使用更多工具查看JVM,可以通过 ‘工具’-> ‘插件’安装更多工具
使用Visual VM 查看linux中tomcat运行时JVM内存

到此,使用本地的VisualVM查看远程的JVM已经完毕,谢谢大家的查看!!