JVM监控工具VisualVM的使用


VisualVM(All-in-One Java Troubleshooting Tool)是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序。
通过插件扩展支持,VisualVM可以做到:

  • 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。
  • 监视应用程序的CPU、GC、堆、方法区以及线程的信息(jstat、jstack)。
  • dump以及分析堆转储快照(jmap、jhat)。
  • 方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法。
  • 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,
  • 可以将快照发送开发者处进行Bug反馈。

VisualVM安装

下载地址
配置文件
打开配置文件配置jdkhome

visualvm_jdkhome="D:/work/Java/jdk1.8.0_181"

安装插件

点击“Tool”→“Plugins”→“available Plugins” 选择插件Install
插件安装

  1. Visaul GC,可以参考详细的GC信息和内存使用情况,很详细哦。不过远程访问不支持JMX方式,必须用jstatd方式
  2. Visaul MBeans,jmx管理界面,可以管理应用中个所有mbean。如果使用spring,可以通过spring的jmx整合,将bean暴露出来,即可实时的修改各项应用配置。
  3. Profile,cpu和内存性能分析,可以按照包名过滤不需要监控的类
  4. BTrace,可以在不宕机的情况下调试代码。在visualVM上可以右键选中Trace Applicationg…打开BTrace窗口(只支持本地jvm)

本地监控

本机运行Java程序,一个产生两个1000以内的随机整数,输出这两个数字相加的结果Java代码如下

package com.hao.jvm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BTraceTest {
        public int add(int a, int b) {
            return a + b;
        }

        public static void main(String[] args) throws IOException, InterruptedException {
            BTraceTest test = new BTraceTest();
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            for (int i = 0; i<10;i++){
                reader.readLine();
                int a = (int) Math.round(Math.random() * 1000);
                int b = (int) Math.round(Math.random() * 1000);
                System.out.println(test.add(a, b));
                Thread.sleep(300);
            }
        }
    }

在这里插入图片描述
可以左侧Application导航栏看到运行中的程序。选中查看内存、线程、类等信息。

监控远程jvm

一、远程服务器启动jstatd守护进程

  1. 在JDK/bin下新建一文本文件, 名称 jstatd.all.policy
    内容如下:

     grant codebase "file:${java.home}/../lib/tools.jar" {
        permission java.security.AllPermission;
     };
    
  2. 运行 jstatd -J-Djava.security.policy=jstatd.all.policy若需要指定端口, 请使用 -p 3333
    指定守护进程监听的ip(默认是127.0.0.1),请使用
    -J-Djava.rmi.server.hostname=192.168.1.134
    查看日志,请使用-J-Djava.rmi.server.logCalls=true
    另外注意防火墙,需要使用3333之外的其他端口

  3. 在终端启动VisualVM.

二、JMX方式

JAVA_OPTS="Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmx remote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true 
-Djava.rmi.server.hostname=192.168.1.134"
  1. 鉴权方法

jdk/jre/lib/management/jmxremote.access 定义了2种权限,读写和只读
monitorRole readonly表示只能监控
controlRole readwrite表示可以修改jmx的各项配置

可以添加任意用户,如:
admin readwrite
jdk/jre/lib/management/jmxremote.password
定义了jmxremote.access中的用户名的密码,如:
admin 123456

BTrace动态日志跟踪

  • BTrace是一个很“有趣”的VisualVM插件,本身也是可以独立运行的程序。它的作用是在不停止目标程序运行的前提下,通过HotSpot虚拟机的HotSwap技术[4]动态加入原本并不存在的调试代码。这项功能对实际生产中的程序很有意义:经常遇到程序出现问题,但排查错误的一些必要信息,譬如方法参数、返回值等,在开发时并没有打印到日志之中,以至于不得不停掉服务,通过调试增量来加入日志代码以解决问题。当遇到生产环境服务无法随便停止时,缺一两句日志导致排错进行不下去是一件非常郁闷的事情。

  • 在VisualVM中安装了BTrace插件后,在应用程序面板中右键点击要调试的程序,会出现“Trace Application……”菜单,点击将进入BTrace面板。这个面板里面看起来就像一个简单的Java程序开发环境,里面还有一小段Java代码,如图所示。
    -在这里插入图片描述
    代码如下:

    /* BTrace Script Template */
     import com.sun.btrace.annotations.*;
     import static com.sun.btrace.BTraceUtils.*;
     
     @BTrace
     public class TracingScript {
         @OnMethod(
                 clazz = "com.hao.jvm.BTraceTest",
                 method = "add",
                 location = @Location(Kind.RETURN)
         )
         
         public static void func(int a,int b,@Return int result){
             println("调用堆栈:");
             jstack();
             println(strcat("方法参数A:", str(a)));
             println(strcat("方法参数B:", str(b)));
             println(strcat("方法结果:", str(result)));
         }
     }
    

点击“Start”按钮后稍等片刻,编译完成后,可见Output面板中出现“BTrace code
successfuly deployed”的字样。程序运行的时候在Output面板将会输出如图4-17所示的调试信息。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章