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所示的調試信息。
在這裏插入圖片描述

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