柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

JVM监控和分析工具

http://www.51niux.com/?id=219   #已经记录了一些常用的jvm查看的命令,这里记录一些工具。

       现实企业级Java开发中,有时候我们会碰到下面这些问题:OutOfMemoryError内存不足、内存泄露、线程死锁、锁争用(Lock Contention)、Java进程消耗CPU过高等,人工分析效率比较低,所以用工具来分析jvm相关问题,可以起到很好的效果。

       jvm监控分析工具一般分为两类:一种是jdk自带的工具,一种是第三方的分析工具。jdk自带工具一般在jdk安装包的bin目录下面,比较常用的是jconsole.exe和jvisualvm.exe。第三方的分析工具有很多,各自的侧重点不同,比较有代表性的:MAT(Memory Analyzer Tool)、GChisto等。

       对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现。JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。其中VisualVM和MAT是dump文件的分析利器。

#官网查看工具链接:https://docs.oracle.com/javase/9/tools/

一、jdk自带的工具

1.1 jconsole

      Jconsole(Java Monitoring and Management Console)是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存,线程和类等的监控,是一个基于JMX(java management extensions)的GUI性能监测工具。jconsole使用jvm的扩展机制获取并展示虚拟机中运行的应用程序的性能和资源消耗等信息。

远程被监控jvm的设置:

#网上监控tomcat的博客比较多,意思差不多,这里线上用的是resin就以resin为例吧。这个resin举例还挺有意思的,因为以前的配置文件是resin.conf后来改成了resin.xml,然后网上这方面的资料也比较少,有的话也基本照着做也是不对的,所以这个例子挺好的。

第一种方式,直接修改resin.xml的方式:

# vim /usr/local/resin/conf/resin.xml

  <cluster id="app">  #这个是配置文件本身就有的
    <!-- define the servers in the cluster -->
    <!-- JVM参数 -->
    <server-default>  #这里到下面</server-default>都是要添加的
         <!-- 服务器模式 -->
         <jvm-arg>-server</jvm-arg>
           <!-- JMX监控配置 -->
           <jvm-arg>-Djava.rmi.server.hostname=192.168.14.49</jvm-arg>
           <jvm-arg>-Dcom.sun.management.jmxremote.port=50000</jvm-arg>
           <jvm-arg>-Dcom.sun.management.jmxremote.ssl=false</jvm-arg>
           <jvm-arg>-Dcom.sun.management.jmxremote.authenticate=true</jvm-arg>
           <jvm-arg>-Dcom.sun.management.jmxremote.password.file=${resin.root}/conf/mxremote.password</jvm-arg>
           <jvm-arg>-Dcom.sun.management.jmxremote.access.file=${resin.root}/conf/jmxremote.access</jvm-arg>
           <!-- JXM监控配置end -->
           <!-- 性能参数 --> #下面性能调优的地方不用加哈,只是加到这里记录一下。
           <jvm-arg>-XX:+UnlockExperimentalVMOptions</jvm-arg>
           <jvm-arg>-XX:+UseG1GC</jvm-arg> 
           <jvm-arg>-XX:MaxGCPauseMillis=50</jvm-arg> 
           <jvm-arg>-XX:GCPauseIntervalMillis=200</jvm-arg> 
           <jvm-arg>-XX:SurvivorRatio=6</jvm-arg> 
           <jvm-arg>-Xmx2048m</jvm-arg> 
           <jvm-arg>-Xms2048m</jvm-arg> 
           <jvm-arg>-Xss1m</jvm-arg> 
           <jvm-arg>-XX:MaxPermSize=512m</jvm-arg> 
           <jvm-arg>-Xloggc:${resin.root}/log/jdk_gc.log</jvm-arg>
    </server-default>
    <server-multi id-prefix="app-" address-list="${app_servers}" port="6800"/>

#上面的配置文件很好理解啊,rmi.server.hostname这里是jdk监听的地址,jmxremote.port这里jconsole要连接的端口,authenticate=true是开启验证的意思,password.file#是账户密码文件的位置,access.file是账户用友权限文件的位置。/usr/java/jdk/jre/lib/management/目录下面有参考文件可以参考。

blob.png

#从jconsole的测试图示可以看出这种方式是可以的哈。

第二种方式,直接修改resin.sh的方式:

# vim /usr/local/resin/bin/resin.sh

export JAVA_HOME=/usr/java/jdk
export RESIN_HOME=/usr/local/resin
ENV=" -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.14.49 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.password.file=${RESIN_HOME}/conf/mxremote.password -Dcom.sun.management.jmxremote.access.file=${RESIN_HOME}/conf/jmxremote.access"
exec $JAVA_EXE -jar ${RESIN_HOME}/lib/resin.jar ${ENV} $@    #这句话是要修改的,上面三句话是要添加的。

#如果这两种方式都设置了,当然resin.sh里面的设置最终会生效。这就类似于启动的时候再传参的效果,后传参肯定会替代旧的参数的值哈。

远程被监控相关文件的设置:

# vim /usr/local/resin/conf/mxremote.password

Myadmin 51niux.com

# vim  /usr/local/resin/conf/jmxremote.access

Myadmin readonly

#chmod 600 /usr/local/resin/conf/mxremote.password   #权限不能放太开不然会有下面的报错,也就是你的设置不会生效

错误: 必须限制口令文件读取访问权限: /usr/local/resin/conf/mxremote.password

启动resin服务:

# /usr/local/resin/bin/resin.sh start   #这就是启动服务

#这里有一点要注意的什么配置都不是一成不变的,所以当发现配置不生效的时候记得通过日志来排查一下# tail -f /usr/local/resin/log/jvm-app-0.log    #遇到问题看日志是一个非常好的习惯要养成哈。

#如果你想跟着官网文档嗨一波,可以的:http://www.caucho.com/resin-4.0/index.xtp

客户端jconsole的连接:

#首先windows本机要安装jdk哈,例如目录:C:\Program Files\Java\jdk-9.0.1\bin下面有一个jconsole.exe,双击一下就可以了。

blob.png

blob.png

blob.png

#默认是概述图,以图表的方式显示出堆内存使用量,活动线程数,已加载的类,CUP占用率的折线图,可以非常清晰的观察在程序执行过程中的变动情况。

使用jconsole:

#如果觉得不够嗨,虽然上图标题已经很明显指出什么是什么了,但是我还想深入的了解下jconsole。

#好的要是有时间还是好好看下官网先:https://docs.oracle.com/javase/9/management/using-jconsole.htm#JSMGM-GUID-77416B38-7F15-4E35-B3D1-34BFD88350B5

监视内存消耗:

#“内存”选项卡提供有关内存消耗和内存池的信息。

blob.png

监视线程使用:

主界面展示线程数的活动数和峰值,同时点击左下方线程可以查看线程的详细信息,比如线程的状态是什么,堆栈内容等,同时也可以点击“检测死锁”来检查线程之间是否有死锁的情况。#详细看官网吧

监视类加载:

blob.png

#红线是类加载的总数(包括已经卸载的类),蓝线是当前加载的类的总数。

查看vm信息:

展示JVM所有信息总览,包括基本信息、线程相关、堆相关、操作系统、VM参数等。

此选项卡中显示的信息包括以下内容:

#概要
连接名称:账户名@IP地址
虚拟机:VM的版本号
正常运行时间:Java VM启动以来的总时间。
进程CPU时间:Java VM自启动以来消耗的CPU时间总量。
供应商:
名称:pid@hostname
JIT编译器:
总编译时间:在JIT编译中花费的总时间。 Java VM确定何时发生JIT编译。 Hotspot VM使用自适应编译,其中VM使用标准解释器启动应用程序,但在运行时分析代码以检测性能瓶颈或热点。

#Threads
活动线程:活守护线程的当前数量加非守护线程。
峰值:Java VM启动以来的最大活动线程数。
守护线程:当前的守护线程数量。
已启动线程总数:Java VM启动后启动的线程总数,包括守护进程,非守护进程和终止线程。
#class
当前加载的类:当前加载到内存中的类的数量。
加载的总类数:自Java VM启动以来加载到内存中的类的总数,包括随后被卸载的类。
卸载的总类数:自Java VM启动以来从内存中卸载的类的数量。

#Memory
当前堆大小:堆当前占用的千字节数。
提交的内存:分配给堆使用的内存总量。
最大堆大小:堆占用的最大千字节数。
暂挂最终对象:终止对象的数量。
垃圾收集器:关于垃圾收集的信息,包括垃圾收集器名称,执行的收集数量以及执行GC所花费的总时间。

#操作系统
操作系统:内核版本
体系结构:如amd64
处理程序数:也就是CPU核数
总物理内存:操作系统的随机存取内存(RAM)数量。
空闲物理内存:KB为单位
总交换空间:
空闲交换空间:
可用物理内存:可用于操作系统的可用RAM的数量。
提交的虚拟内存:保证可用于正在运行的进程的虚拟内存量kb为单位。

#其他信息
VM参数:应用程序传递给Java VM的输入参数,不包括主方法的参数。
类路径:系统类加载器用于搜索类文件的类路径。
库路径:加载库时要搜索的路径列表。
引导类路径:引导类加载器用来搜索类文件的路径。

MBean:

MBeans”选项卡以,查看Mbean的属性,方法等。通用方式显示有关在平台MBean服务器中注册的所有MBean的信息。 MBeans选项卡允许访问整套平台MXBean工具,包括其他选项卡中不可见的工具。 另外,您可以使用MBeans选项卡监视和管理应用程序的MBean。#详细使用看官网......

1.2 VisualVM

       VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序(Java 应用程序)的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该信息。您可以查看本地应用程序以及远程主机上运行的应用程序的相关数据。此外,还可以捕获有关 JVM 软件实例的数据,并将该数据保存到本地系统,以供后期查看或与其他用户共享。

官网链接:https://docs.oracle.com/javase/7/docs/technotes/guides/visualvm/

使用Java VisualVm:

#windows本地的C:\Program Files\Java\jdk1.8.0_131\bin目录下的jvisualvm.exe可执行文件双击下就可以了。

blob.png

blob.png

blob.png

blob.png

blob.png

插件安装:

工具==》插件

blob.png

#安装完之后客户端也就是windows这台机器记得重启一下。如果失败多点击几次重试,不成就先把别的装完再回来安装没装的。

#VisualVM可以根据需要安装不同的插件,每个插件的关注点都不同,有的主要监控GC,有的主要监控内存,有的监控线程等。

#最起码Visual GC插件是需要安装的。Java VisualVM默认没有安装Visual GC插件,需要手动安装。

blob.png

#上图是插件都安装完毕之后的效果图。

jstatd设置:

blob.png

#如上图:Visual GC提示"不受此JVM支持”,那就要配置jstatd。但是jstatd又不支持显示CPU......

linux服务端的配置:

# vim /usr/java/jdk/jre/lib/security/java.policy

        permission java.util.PropertyPermission "java.vm.name", "read";
        permission java.security.AllPermission;   #在文件末尾的};的上面加上这么一句话
};

# cd /usr/java/jdk/bin/

# ./jstatd -J-Djava.security.policy=jstatd.policy -J-Djava.rmi.server.hostname=192.168.14.49

#上面是启动jstatd服务,监听IP是192.168.14.49,默认端口是1099,加-p 端口号可以指定对外开放端口。

#然后查看一下1099端口启动起来没有。如下面:

tcp6       0      0 :::1099                 :::*                    LISTEN      12474/./jstatd

windows客户端的连接:


blob.png

blob.png

blob.png

#Visual GC 是常常使用的一个功能,可以明显的看到年轻代、老年代的内存变化,以及gc频率、gc的时间等。 

作者:忙碌的柴少 分类:JVM 浏览:3206 评论:0
留言列表
发表评论
来宾的头像