zoukankan      html  css  js  c++  java
  • 使用Visual VM 查看linux中tomcat运行时JVM内存

    前言:在生产环境中经常发生服务器内存溢出,假死或者线程死锁等异常,导致服务不可用。我们经常使用的解决方法是通过分析错误日记,然后去寻找代码到底哪里出现了问题,这样的方式也许会奏效,但是排查起来耗费时间比较多,或者说本身代码本身就没有错,而是访问量大时候消耗内存太多,垃圾对象没有及时回收等等其他情况导致的,这样排查异常起来异常困难,那么有没有一些可视化的工具,帮助我们可以详细地查看当前应用服务的内存情况,从而为我们在解决异常、优化代码、优化服务等方面提供一些建议呢?幸好,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:暴露的访问端口,不能和其他端口重复
    添加后的效果图:
    这里写图片描述

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

    如果上述步骤没有出现问题,那么你已经接近成功一大半
    接下来在本地机器上打开jdk/bin/jvisualvm.exe,如图是visual VM的开始页面
    这里写图片描述

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

    这里写图片描述

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

    这里写图片描述

      JMX连接成功后,你已经可以查看JVM的参数,如堆栈大小等JVM相关参数,查看服务器cpu消耗情况,手动执行垃圾回收、导出堆dump镜像,查看类、线程的总数和分布情况等权限
    这里写图片描述

    这里写图片描述

    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 后的效果图如下:
    这里写图片描述

    在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 GC选项卡可以看到tomcat的内存使用分布图,永久区、老年代、新生代的使用情况、垃圾回收的信息。要使用更多工具查看JVM,可以通过 ‘工具’-> ‘插件’安装更多工具
    这里写图片描述

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

  • 相关阅读:
    2018年-2019年第二学期第七周C#学习个人总结
    2018年-2019年第二学期第六周C#学习个人总结
    2018年-2019年第二学期第五周C#学习个人总结
    2018年-2019年第二学期第四周C#学习个人总结
    2018年-2019年第二学期第三周C#学习个人总结
    2018年-2019年第二学期第二周C#学习个人总结
    本学期C#学习个人总结
    排球积分程序
    观后感
    最终总结
  • 原文地址:https://www.cnblogs.com/ldsweely/p/9354874.html
Copyright © 2011-2022 走看看