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
- Visaul GC,可以參考詳細的GC信息和內存使用情況,很詳細哦。不過遠程訪問不支持JMX方式,必須用jstatd方式
- Visaul MBeans,jmx管理界面,可以管理應用中個所有mbean。如果使用spring,可以通過spring的jmx整合,將bean暴露出來,即可實時的修改各項應用配置。
- Profile,cpu和內存性能分析,可以按照包名過濾不需要監控的類
- 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守護進程
-
在JDK/bin下新建一文本文件, 名稱 jstatd.all.policy
內容如下:grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
-
運行 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之外的其他端口 -
在終端啓動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"
- 鑑權方法
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所示的調試信息。