JVM調優工具使用手冊

?作為Java開發人員,我們肯定知道JDK的bin目錄下有"java.exe"、"javac.exe"這兩個命令工具 , 這也是我們平時用得最多的工具 。但其實bin目錄下還有很多工具,這些工具可以幫助我們進行JVM的調優,幫我們定位找出應用程序運行中產生的問題 。下面我們來看看其中一些調優工具 。
前置啟動程序?先啟動一個web應用程序,然后用各種JDK自帶命令優化應用 。
jpsjps?用jps查看應用進行ID

JVM調優工具使用手冊

文章插圖
jinfojinfo -flags 92604?此命令可以實時查看和調整虛擬機各項參數 。
JVM調優工具使用手冊

文章插圖
jmap?此命令可以用來查看內存信息,實例個數以及占用大小 , 還可以生成堆轉儲快照 。
JVM調優工具使用手冊

文章插圖
jmap -histo 14660#查看歷史生成的實例jmap -histo:live 14660#查看當前存活的實例,執行過程中可能會觸發一次full gc打開log.txt,內容如下:
JVM調優工具使用手冊

文章插圖
  • num:序號
  • instances:實例數量
  • bytes:占用空間大小
  • class name:類名稱 , [C is a char[] , [S is a short[],[I is a int[],[B is a byte[],[[I is a int[][]
堆信息?可以查看當前應用的堆具體配置、使用信息 。
jmap -heap 92604
JVM調優工具使用手冊

文章插圖
轉儲堆內存dumpjmap -dump:format=b,file=web.hprof 92604
JVM調優工具使用手冊

文章插圖
也可以設置內存溢出自動導出dump文件(內存很大的時候 , 可能會導不出來)
  1. -XX:+HeapDumpOnOutOfMemoryError
  2. -XX:HeapDumpPath=./(路徑)
示例代碼:
public class OOMTest {public static List<Object> list = new ArrayList<>();// JVM設置    // -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\jvm.dumppublic static void main(String[] args) {List<Object> list = new ArrayList<>();int i = 0;int j = 0;while (true) {list.add(new User(i++, UUID.randomUUID().toString()));}}}jvisualvmjvisualvm?該命令可以打開一個可視化界面,監視當前運行應用程序、dump文件進行故障分析等功能 。
?導入上面示例代碼運行后產生的hprof文件,可以看到User對象實例數名列前茅 。
JVM調優工具使用手冊

文章插圖
jstack?此命令可以用來跟蹤Java堆棧信息 。用于生成虛擬機當前試課的線程快照 ??煺湛梢远ㄎ痪€程出現長時間停頓的原因 , 如線程間死鎖、死循環、請求外部資源導致的長時間等待等都是導致線程長時間停頓的常見原因 。
死鎖示例public class DeadLockTest {private static Object lock1 = new Object();private static Object lock2 = new Object();public static void main(String[] args) {new Thread(() -> {synchronized (lock1) {try {System.out.println("thread1 begin");Thread.sleep(5000);} catch (InterruptedException e) {}synchronized (lock2) {System.out.println("thread1 end");}}}).start();new Thread(() -> {synchronized (lock2) {try {System.out.println("thread2 begin");Thread.sleep(5000);} catch (InterruptedException e) {}synchronized (lock1) {System.out.println("thread2 end");}}}).start();System.out.println("main thread end");}}jstack 100516
JVM調優工具使用手冊

文章插圖
"Thread-1":線程名
prio=5: java線程優先級
os_prio:操作系統線程優先級
nid=0x18688 線程對應的本地線程標識nid
java.lang.Thread.State: BLOCKED 線程狀態
JVM調優工具使用手冊

文章插圖
【JVM調優工具使用手冊】還可以用jvisualvm自動檢測到死鎖 。
JVM調優工具使用手冊

文章插圖
找出占用cpu最高的線程堆棧信息public class Math {public static final int initData = https://www.huyubaike.com/biancheng/666;public static User user = new User();public int compute() {//一個方法對應一塊棧幀內存區域int a = 1;int b = 2;int c = (a + b) * 10;return c;}public static void main(String[] args) {Math math = new Math();while (true){math.compute();}}}1,使用命令top -p,顯示你的java進程的內存情況,pid是你的java進程號,比如18963

推薦閱讀