0、javap
你可以給 javap(Java Class檔案反編譯器)傳遞這些有用的參數:
- -I – 列印行數和局部變量
- -p – 列印包括非public在内的所有類和成員資訊,
- -c – 列印方法位元組碼
比如在著名的“你真的懂 Classloader 嗎?”演講裡,當出現 NoSuchMethodException 錯誤時,我們可以執行以下指令來調查這個類究竟有哪些成員方法和擷取這個類所有想找的資訊:
javap -l -c -p Util2
當調試類内部資訊或者研究随機位元組碼順序時,javap 非常有用。
1、jjs
jjs指令可以啟動一個 JavaScript 指令終端,你可以把它當做電腦或者用随機的JS字元串測試JS的古怪用法。不要讓另一個 JavaScript 謎題讓你措手不及!
哈,看到剛剛發生了什麼了麼?但是 JavaScript 是另一個話題,隻需要知道即使沒有 node.js 或浏覽器你也可以用jjs知道JS是怎麼工作的。
2、jhat
Java堆分析工具(jhat)正如它名字描述的那樣:分析dump堆資訊。在下面的小例子裡,我們構造了一個 OutOfMemoryError ,然後給這個 java 程序指定 -XX:+HeapDumpOnOutOfMemoryError ,這樣運作時就會産生一個 dump 檔案供我們分析。
- public class OhMyMemory {
- private static Map map = new HashMap<>();
- public static void main(String[] args) {
- Runtime.getRuntime().addShutdownHook(
- new Thread() {
- @Override
- public void run() {
- try {
- System.out.println("Enter something, so I'll release the process");
- System.in.read();
- System.out.println("We have accumulated " + map.size() + " entries");
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- );
- for(int i = 0; i < 10000 ;i++) {
- map.put(Integer.toBinaryString(i), i);
- }
- }
- }
注意,現在我們不要消耗大量的記憶體,隻是比較早結束并在程序關閉鈎子裡等待不讓 JVM 退出。這樣就允許我們用 jmap 連接配接這個程序擷取珍貴的記憶體 dump。
是以你可以用 jmap 的兩個功能來實作,擷取堆統計資訊和觸發一個堆 dump。是以,當執行:
jmap -heap 1354(這裡 1354 是上面程式運作的程序号),就可以擷取一個很好的記憶體使用統計資訊:
- $ jstack -F -l 9153
- Attaching to process ID 9153, please wait...
- Debugger attached successfully.
- Server compiler detected.
- JVM version is 25.0-b70
- Deadlock Detection:
- No deadlocks found.
- ….
上面的輸出雖然看起來簡單,但是它包含了每個線程的狀态和它目前的堆棧的資訊。
jstack 非常有用,我們在日常工作中使用非常頻繁,特别是我們負責啟動停止應用伺服器的測試引擎。測試工作往往不順利,jstack 可以讓我們知道 JVM 内部的運作狀态且沒有什麼負面的影響。
— Neeme Praks(ZeroTurnaround資深産品工程師)
還有其它的嗎?
今天我們介紹了 JDK 發行預裝的超棒工具。相信我,将來某天你肯定會用到它們中的一些。是以,如果你有時間,你可以翻一翻它們的官方文檔。
試着在不同的場景使用并愛上它們。
如果你想學一些超棒的非 JDK 附帶的工具,可以看看 JRebel ,它可以讓你馬上看到代碼的改動效果,還可以看到我們新的産品 XRebel ,它可以像X光眼鏡一樣掃描你的 web 應用。
如果你知道開發最佳實踐中至關重要的小工具,在本文末尾發表評論或者在 twitter上@shelajev 分享一下這個工具的細節。
Bonus Section: References
獎勵環節:參考
下面是一個更加完整的 JDK 工具可用清單。雖然這不是一個完整的清單,為了節省篇幅,我們省掉了加密、web-services 相關的工具等。謝謝 manpagez.com 提供的資源。
- jar — 一個建立和管理 jar 檔案的工具。
- java — Java 應用啟動器。在這篇文章裡,開發和部署都是用的這個啟動器。
- javac — Java 編譯器。
- javadoc — API 文檔生成器。
- javah — native 本地方法中用于生成 C 語言頭檔案和源檔案。
- javap — class 檔案反編譯器。
- jcmd — JVM 指令行診斷工具,可發送診斷指令請求到 JVM 中。
- jconsole — 一個相容 JMX 的監控 JVM 的圖形化工具。可以監控本地和遠端 JVM,也可以監控和管理單獨的一個應用。
- jdb — Java 調試器。
- jps — JVM 程序檢視工具,列出了系統運作的所有 hotspot JVM 程序。
- jstat — JVM 狀态監控工具。它可以收集和列印指定的 JVM 程序性能狀态。
- jhat — 堆 dump 資訊的浏覽器,啟動一個 web 伺服器來顯示你用諸如 jmap -dump 得到的堆 dump 資訊。
- jmap — Java 記憶體映射工具,列印指定程序、核心檔案、遠端調試伺服器共享記憶體映射或者堆記憶體詳細資訊。
- jsadebugd — Java 服務調試守護程序—依附到一個 Java 程序或核心檔案并且擔當一個調試伺服器的作用。
- jstack —Java 堆棧資訊工具——列印指定程序或核心檔案或者遠端調試伺服器的線程堆棧。
- jjs — 運作 Nashorn 指令行腳本 shell。
- jrunscript — Java 腳本運作工具。不過你要心裡有數,這實際上是一個還沒支援的測試功能。未來的 JDK 版本裡面可能會移除它。