Java 效能最佳化系列之4[Java效能調優工具],效能最佳化調優
Linux 命令列工具
1.top 命令
即時顯示系統中各個進程的資源佔用狀況。
top 命令的輸出可以分為兩個部分: 前半部分是系統統計資訊, 後半部分是進程資訊。
在統計資訊中:
第1行是任務隊列資訊,它的結果等同於uptime命令。從左至右依次表示: 系統目前時間、系統已耗用時間、當前登入使用者數。 load average表示系統的平均負載,即任務隊列的平均長度,這三個值分別表示1分鐘、5分鐘、15分鐘到現在的平均值。
第2行是進程統計資訊,分別有正在啟動並執行進程數、睡眠進程數、停止的進程數、殭屍進程數。
第3行是CPU統計資訊, us 表示使用者空間CPU佔有率、sy表示核心空間CPU佔有率、ni表示使用者進程空間改變優先順序的進程CPU的佔有率、id表示空閑CPU佔有率、wa表示等待輸入輸出的CPU時間百分比、hi表示硬體插斷要求、si表示軟體插斷要求; 在Mem行中, 從左至右,依次表示實體記憶體總量、已使用的實體記憶體、空閑實體記憶體、核心緩衝使用量。 Swap行依次表示交換區總量、空閑交換區大小、緩衝交換區大小。
top 命令的第2部分是進程資訊區,顯示了系統內各個進程的資源使用方式。
PID : 進程id
PPID: 父進程id
RUSER: Real user name
UID: 進程所有者的使用者id
USER: 進程所有者的使用者名稱
GROUP: 進程所有者的組名
TTY: 啟動進程的終端名。 不是從終端啟動的進程則顯示為 ?
PR: 優先順序
NI: nice值,負值表示高優先順序,正值表示低優先順序
P: 最後使用的CPU, 僅在多CPU環境下有意義
%CPU: 上次更新到現在的CPU時間佔有百分比
TIME: 進程使用的CPU時間總計,單位秒
TIME+: 進程使用的CPU時間總計, 單位 1/100秒
%MEM: 進程使用的實體記憶體百分比
VIRT: 進程使用的虛擬記憶體總量, 單位KB
SWAP: 進程使用的虛擬記憶體中被換出的大小
RES: 進程使用的、未被換出的實體記憶體大小
CODE: 可執行代碼佔用的實體記憶體大小
DATA: 可執行代碼以外的部分佔有的實體記憶體大小
SHR: 共用記憶體大小
nFLT: 分頁錯誤次數
nDRT: 最後一次寫入到現在, 被修改過的頁面數
S: 進程狀態。D 表示不可中斷的睡眠狀態; R表示運行; S表示睡眠; T表示跟蹤/停止; Z表示殭屍進程
COMMAND: 命令名/命令列
WCHAN: 若該進程正在睡眠,則顯示睡眠中的系統函數名。
Flags: 任務標誌。
在top 命令中, 按下f鍵, 可以進行列的選擇, 使用o 鍵可以更改列的顯示順序。此外。 top 命令還有一些實用的互動指令
h : 顯示協助資訊
k: 終止一個進程
q: 退出程式
c: 切換顯示命令名稱和完整命令列
M: 根據駐留記憶體大小進行排序
P: 根據CPU使用百分比大小進行排序
T: 根據時間/累計時間進行排序
數值1: 顯示所有CPU負載情況
2. sar 命令
sar 命令也是linux 系統中重要的效能監測工具之一, 它可以周期性地對記憶體和CPU使用方式進行採樣
sar [options1] [<interval> [<count>]]
interval: 採樣周期
count: 採樣數量
-A :所有報告的總和
-u: CPU利用率
-d: 硬碟使用報告
-b: I/O 的情況
-q: 查看隊列長度
-r: 記憶體使用量統計資訊
-n: 網路資訊統計
-o: 採樣結果輸出到檔案
3. vmstat
它可以統計CPU 記憶體使用量情況、swap使用方式等資訊。
和sar 類似, vmstat 也可以指定採樣周期和採樣次數
4. iostat 命令
提供詳盡的I/O 資訊。
5. pidstat 工具
一個功能強大的效能監測工具, 它也是Sysstat 的組件之一。 可以到
http://www.icewalkers.com/Linux/Software/59040/Sysstat.html
下載。 下載後安裝即可。
pidstat 的強大之處在於, 它不僅可以監視進程的效能情況, 也可以監視線程的效能情況。
要監控程式的CPU使用率, 可以先使用jps 命令找到PID.然後使用pidstat命令輸出程式的CPU使用方式。
pidstat 的參數-p 用於指定進程ID, -u 表示對CPU使用率的監控。
使用pidstat 可以
-- CPU 使用率監控
-- I/O 使用監控
-- 記憶體監控
Windows 工具
1. 工作管理員
2. perfmon 效能監控工具
在命令列中使用 perfmon 命令。
3. Process Explorer
到
https://technet.microsoft.com/en-us/sysinternals/bb896653
下載。
Process Explorer 不僅顯示了系統內所有的進程, 還進一步顯示了進程 見的父子關係。
4. pslist 命令列
可以到:
https://technet.microsoft.com/en-us/sysinternals/bb896682
下載。
基本用法:
pslist [-d][-m][-x][-t][-s [n] [-r n] [name|pid]
-d 顯示線程詳細資料
-m 顯示記憶體詳細資料
-x: 心事進程、記憶體和線程資訊
-t: 顯示進程間父子關係
-s[n]: 進入監控模式。 n 指定程式已耗用時間, 使用ESC鍵退出。
-r n 指定監控模式下的重新整理時間,單位為秒
name: 指定監控的進程名稱
-e: 使用精確匹配
pid: 指定進程ID
JDK 命令列工具
工具在JDK安裝目錄的bin 目錄中
這些exe 可執行檔只是 Java程式的一層封裝, 真正實現是在tools.jar中
以jps 工具為例, 執行這個exe 和使用命令列
java -classpath %Java_HOME%/lib/tools.jar sun.tools.jps.Jps 命令是等價的。
1. jps 命令
類似於Linux下的ps, 但它只用於列出Java的進程。直接運行jps不加任何參數, 可以列出Java程式的進程ID以及Main函數等名稱。
-q 指定jps 只輸出進程ID
-m 用於輸出傳遞給Java進程的參數
-l 用於輸出主函數的完整路徑
-v 可以顯示傳遞給JVM的參數
2. jstat
可以用於觀察Java應用程式運行時資訊的工具。可以通過它,查看堆資訊的詳細情況, 基本使用文法為:
jstat -<option> [-t] [-h<lines>]<vmid>[<interval> [count]]
-class: 顯示ClassLoader的相關資訊
-compiler: 顯示JIT編譯的相關資訊
-GC: 顯示與GC相關的堆資訊
-gccapacity: 顯示各個代的容量及使用方式
-gccause: 顯示垃圾收集相關資訊, 同時顯示最後一次或當前正在發生的垃圾收集的誘發原因
-gcnew: 顯示新生代資訊
-gcnewcapacity: 顯示新生代大小與使用方式
-gcold: 顯示老年代和永久代的資訊
-gcoldcapacity: 顯示永久代的大小
-gcutil: 顯示垃圾收集資訊
-printcompilation: 輸出JIT編譯的方法資訊
-g 參數可以在輸出資訊前加上一個Timestamp列,顯示程式的已耗用時間
-h 參數可以在周期性資料輸出時,輸出多少行資料後,跟著輸出一個表頭資訊
interval 參數用於指定輸出統計資料的周期,單位為毫秒
count 用於指定一共輸出多少次資料
3. jinfo 命令
用來查看正在啟動並執行Java 應用程式的擴充參數,甚至支援在運行時修改部分參數, 基本文法為:
jinfo <option><pid>
-flag<name>: 列印指定JVM的參數值
-flag [+|-]<name>: 設定指定JVM參數的布爾值
-flag <name>=<value>: 設定指定JVM參數的值
4. jmap 命令
可以產生Java應用程式的堆快照和對象的統計資訊
例如
jmap -histo 2972 >c:\s.txt
5. jhat 命令
用於分析Java 應用程式的堆快照內容。
6. jstack 命令
用於匯出Java應用程式的線程堆棧:
jstack [-l] <pid>
-l: 用於列印鎖的附加資訊
7. jstatd
在以上工具中, 一些監控工具也支援對遠端電腦的監控(jps,jstat). 為了啟用遠程監控,則需要配合使用jstatd工具。
8. hprof 工具
hprof 不是獨立的監控工具,它只是一個Java agent工具,它可以用於監控Java應用程式在運行時的CPU資訊和堆資訊。
JConsole 工具
JConsole 工具是JDK內建的圖形化效能監控工具。 可以查看Java應用程式的運行概況, 監控堆資訊、永久區使用方式、類載入情況等。
1. JConsole串連Java程式JConsole 程式在 %JAVA_HOME%/bin 目錄下。啟動後, 可以串連本地進程也可以串連遠端進程。
串連本地進程就不用多介紹了。 如果串連的是遠端進程。則需要在遠程Java應用程式啟動時, 加上如下參數:
-Djava.rmi.server.hostname=127.0.0.1-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=8888-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname 用於指定運行Java應用程式的電腦IP地址, -Dcom.sun.management.jmxremote.port 用於指定通過JMX管理該進程的連接埠號碼。
2. Java 程式概況 以上四張折線圖顯示了堆記憶體的使用方式、系統線程數量、載入類的數量以及CPU 的使用率
3. 使用外掛程式除了準系統外, JConsole 還支援外掛程式擴充. 在JDK的安裝目錄下, 就有一個內建的JConsole外掛程式, 它位於 %JAVA_HOME%\demo\management\JTop 下。 可以使用如下命令讓JConsole 載入外掛程式並啟動
jconsole -pluginpath %JAVA_HOME%/demo/management/JTop/JTop.jar
JTop 外掛程式按照CPU 佔用時間排序, 將佔用CPU時間最長的線程顯示在表格頂端。器的哦2. Visual VM 多合一工具
Visual VM是一個功能強大的多合一故障診斷和效能監控的視覺化檢視, 它整合了多種效能統計工具的功能, 使用Visual VM可以代替jstat,jmap,jhat,jstack 甚至JConsle. 在JDK 6 Update 7 以後, Visual VM 便作為JDK的一部分發布, 它完全免費。作為獨立的軟體安裝, 也可以在http://visualvm.java.net 下載。Visual VM也可以安裝一些外掛程式:
可以通過離線下載外掛程式檔案 *.nbm, 然後在Plugin 對話方塊的Downloaded 頁面下, 添加已下載的外掛程式。
1. Visual VM 支援多種方式串連應用程式, 最常用的就是本地串連。只要本機電腦內有Java應用程式正在執行, 在Visual VM的Local 節點下, 就會出現這些應用。
雙擊應用程式或者右鍵開啟, 就能夠監控應用程式運行。由於Visual VM 本身也是Java應用程式, 因此, 自身也在列表內。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。