Java性能調優工具
1、JDK命令行工具
1.1、jps命令
jps用於列出Java的進程,jps可以增加參數,-m用於輸出傳遞給Java進程的參數,-l用於輸出主函數的完整路徑,-v可以用於顯示傳遞給jvm的參數。
1 2 |
|
1.2、jstat命令
jstat是一個可以用於觀察Java應用程序運行時信息的工具,它的功能非常強大,可以通過它查看堆信息的詳細情況,它的基本使用方法爲:
1 |
|
選項option可以由以下值組成:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
這些參數中最常用的參數是gcutil,下面是該參數的輸出介紹以及一個簡單例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1.3、jinfo命令
jinfo可以用來查看正在運行的Java應用程序的擴展參數,甚至在運行時修改部分參數,它的基本語法爲:
1 |
|
jinfo可以查看運行時參數:
1 2 |
|
jinfo還可以在運行時修改參數值:
1 2 3 4 5 |
|
1.4、jmap命令
jmap命令主要用於生成堆快照文件,它的使用方法如下:
1 2 3 |
|
獲得堆快照文件之後,我們可以使用多種工具對文件進行分析,例如jhat,visual vm等。
1.5、jhat命令
使用jhat工具可以分析Java應用程序的堆快照文件,使用命令如下:
1 2 3 4 5 6 7 8 9 10 |
|
jhat在分析完成之後,使用HTTP服務器展示其分析結果,在瀏覽器中訪問http://127.0.0.1:7000/即可得到分析結果。
1.6、jstack命令
jstack可用於導出Java應用程序的線程堆棧信息,語法爲:
1 |
|
jstack可以檢測死鎖,下例通過一個簡單例子演示jstack檢測死鎖的功能。java代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
|
使用jps命令查看進程號爲32627,然後使用jstack -l 32637 > a.txt命令把堆棧信息打印到文件中,該文件內容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
|
從這個輸出可以知道:
1、在輸出的最後一段,有明確的"Found one Java-level deadlock"輸出,所以通過jstack命令我們可以檢測死鎖;
2、輸出中包含了所有線程,除了我們的north,sorth線程外,還有"Attach Listener", "C2 CompilerThread0", "C2 CompilerThread1"等等;
3、每個線程下面都會輸出當前狀態,以及這個線程當前持有鎖以及等待鎖,當持有與等待造成循環等待時,將導致死鎖。
1.7、jstatd命令
jstatd命令是一個RMI服務器程序,它的作用相當於代理服務器,建立本地計算機與遠程監控工具的通信,jstatd服務器能夠將本機的Java應用程序信息傳遞到遠程計算機,由於需要多臺計算機做演示,此處略。
1.8、hprof工具
hprof工具可以用於監控Java應用程序在運行時的CPU信息和堆信息,關於hprof的官方文檔如下:https://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html
2、Visual VM工具
Visual VM是一個功能強大的多合一故障診斷和性能監控的可視化工具,它集成了多種性能統計工具的功能,使用Visual VM可以替代jstat、jmap、jhat、jstack等工具。在命令行輸入jvisualvm即可啓動visualvm。
打開Visual VM之後,左邊導航欄會顯示出當前機器所有Java進程:
點擊你想監控的程序即可對該程序進行監控,Visual VM的性能監控頁一共有以下幾個tab頁:
概述頁會顯示程序的基本使用情況,比如,進程ID,系統屬性,啓動參數等。
通過監視頁面,可以監視應用程序的CPU、堆、永久區、類加載器和線程數的整體情況,通過頁面上的Perform GC和Heap Dump按鈕還可以手動執行Full GC和生成堆快照。
線程頁面會提供詳細的線程信息,單擊Thread Dump按鈕可以導出當前所有線程的堆棧信息,如果Visual VM在當前線程中找到死鎖,則會以十分顯眼的方式在Threads頁面給予提示。
抽樣器可以對CPU和內存兩個性能進行抽樣,用於實時地監控程序。CPU採樣器可以將CPU佔用時間定位到方法,內存採樣器可以查看當前程序的堆信息。下面是一個頻繁調用的Java程序,我們會對改程序進行採樣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
|
通過Visual VM的採樣功能,可以找到改程序中佔用CPU時間最長的方法:
默認Visual VM不統計內置對象的函數調用,比如java.*包中的類,如果要統計這些內置對象,單機右上角的設置進行調配。Visual VM雖然可以統計方法的調用時間,但是無法給出方法調用堆棧,Jprofile不僅可以給出方法調用時間,還可以給出方法調用堆棧,較Visual VM更強大。
右擊左導航的應用程序,會出現以下菜單:
單機應用程序快照,可以分析當前應用程序的快照,單擊堆Dump能夠對當前的堆信息進行分析。Visual VM的更多使用方法,可以查看Oracle的官方文檔https://docs.oracle.com/javase/7/docs/technotes/guides/visualvm/index.html
BTrace插件
BTrace是一款功能強大的性能檢測工具,它可以在不停機的情況下,通過字節碼注入,動態監控系統的運行情況,它可以跟蹤指定的方法調用、構造函數調用和系統內存等信息,本部分打算舉一個例子,講解一下BTrace的使用。要在Visual VM中使用Btrace,首先需要安裝Btrace插件,點擊工具->插件即可在線安裝,安裝後右鍵應用程序,就會出現如下選項:
點擊Trace application,即可進入BTrace插件界面。使用BTrace可以監控指定函數的耗時,以下腳本通過正則表達式,監控所有類的getNameById方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
點擊運行,部分輸出如下:
1 2 3 4 |
|
BTrace除了可以監控函數耗時外,還可以指定程序運行到某一行代碼觸發某一行爲,定時觸發行爲,監控函數參數等等。
3、MAT內存分析工具
MAT是一款功能強大的Java堆內存分析器,可以用於查找內存泄露以及查看內存消耗情況,MAT的官方文檔如下:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html。
在MAT中有淺堆和深堆的概念,淺堆是指一個對象結構所佔用的內存大小,深堆是指一個對象被GC回收後可以真正釋放的內存大小。
通過MAT,可以列出所有垃圾回收的根對象,Java系統的根對象可能是以下類:系統類,線程,Java局部變量,本地棧等等。在MAT中還可以很清楚的看到根對象到當前對象的引用關係鏈。
MAT還可以自動檢測內存泄露,單擊菜單上的Leak Suspects命令,MAT會自動生成一份報告,這份報告羅列了系統內可能存在內存泄露的問題點。
在MAT中,還可以自動查找並顯示消耗內存最多的幾個對象,這些消耗大量內存的大對象往往是解決系統性能問題的關鍵所在。