溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中JDK內(nèi)建工具有哪些

發(fā)布時間:2021-12-04 14:47:20 來源:億速云 閱讀:130 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“java中JDK內(nèi)建工具有哪些”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“java中JDK內(nèi)建工具有哪些”這篇文章吧。

0、javap

你可以給 javap(Java Class文件反編譯器)傳遞這些有用的參數(shù):

  • -I – 打印行數(shù)和局部變量

  • -p – 打印包括非public在內(nèi)的所有類和成員信息,

  • -c – 打印方法字節(jié)碼

比如在著名的“你真的懂 Classloader 嗎?”演講里,當出現(xiàn) NoSuchMethodException 錯誤時,我們可以執(zhí)行以下命令來調(diào)查這個類究竟有哪些成員方法和獲取這個類所有想找的信息:

javap -l -c -p Util2

java中JDK內(nèi)建工具有哪些

當調(diào)試類內(nèi)部信息或者研究隨機字節(jié)碼順序時,javap 非常有用。

1、jjs

java中JDK內(nèi)建工具有哪些

jjs命令可以啟動一個 JavaScript 命令終端,你可以把它當做計算器或者用隨機的JS字符串測試JS的古怪用法。不要讓另一個 JavaScript 謎題讓你措手不及!

哈,看到剛剛發(fā)生了什么了么?但是 JavaScript 是另一個話題,只需要知道即使沒有 node.js 或瀏覽器你也可以用jjs知道JS是怎么工作的。

2、jhat

Java堆分析工具(jhat)正如它名字描述的那樣:分析dump堆信息。在下面的小例子里,我們構造了一個 OutOfMemoryError  ,然后給這個 java 進程指定 -XX:+HeapDumpOnOutOfMemoryError ,這樣運行時就會產(chǎn)生一個 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() {          System.out.println("We have accumulated " + map.size() + " entries");        }      }    );    for(int i = 0; ;i++) {      map.put(Integer.toBinaryString(i), i);    } } }

產(chǎn)生一個 OutOfMemoryError 很簡單(大部分情況下我們無意為之),我們只要不斷地制造不讓垃圾回收器起作用就可以了。

運行這段代碼會產(chǎn)生如下輸出:

org.shelajev.throwaway.jdktools.OhMyMemory java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid5644.hprof ... Heap dump file created [73169721 bytes in 0.645 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.HashMap.resize(HashMap.java:703) at java.util.HashMap.putVal(HashMap.java:662) at java.util.HashMap.put(HashMap.java:611) at org.shelajev.throwaway.jdktools.OhMyMemory.main(OhMyMemory.java:24) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) We have accumulated 393217 entries

不錯,我們現(xiàn)在有一個可供分析的文件了。我們對這個文件執(zhí)行jhat開始進行分析,jhat 會分析這個文件開啟一個 http 服務器供我們查看結(jié)果。

$ jhat java_pid5644.hprof Reading from java_pid5644.hprof... Dump file created Thu Aug 14 14:48:19 EEST 2014 Snapshot read, resolving... Resolving 1581103 objects... Chasing references, expect 316 dots... Eliminating duplicate references........ Snapshot resolved. Started HTTP server on port 7000 Server is ready.

可以通過訪問 http://localhost:7000 來查看 dump 的數(shù)據(jù)。

java中JDK內(nèi)建工具有哪些

在那個頁面我們可以通過堆信息的柱狀圖了解究竟是什么耗盡了內(nèi)存。

java中JDK內(nèi)建工具有哪些

現(xiàn)在我們可以清晰地看到擁有 393567 結(jié)點的 HashMap 就是導致程序崩潰的元兇。雖然有更多可以檢查內(nèi)存分布使用情況和堆分析的工具,但是jhat是內(nèi)置的,是分析的一個好的開端。

3、jmap

jmap 是一個內(nèi)存映射工具,它提供了另外一種不需要引發(fā) OutOfMemoryErrors 就可以獲取堆 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);    } } }

注意,現(xiàn)在我們不要消耗大量的內(nèi)存,只是比較早結(jié)束并在進程關閉鉤子里等待不讓 JVM 退出。這樣就允許我們用 jmap 連接這個進程獲取珍貴的內(nèi)存 dump。

因此你可以用 jmap 的兩個功能來實現(xiàn),獲取堆統(tǒng)計信息和觸發(fā)一個堆 dump。因此,當執(zhí)行:

jmap -heap 1354(這里 1354 是上面程序運行的進程號),就可以獲取一個很好的內(nèi)存使用統(tǒng)計信息:

$ jmap -heap 1354                                                                                                                   Attaching to process ID 1354, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.0-b70  using thread-local object allocation. Parallel GC with 4 thread(s)  Heap Configuration:    MinHeapFreeRatio         = 40    MaxHeapFreeRatio         = 70    MaxHeapSize              = 67108864 (64.0MB)    NewSize                  = 1572864 (1.5MB)    MaxNewSize               = 22020096 (21.0MB)    OldSize                  = 45088768 (43.0MB)    NewRatio                 = 2    SurvivorRatio            = 8    MetaspaceSize            = 21807104 (20.796875MB)    CompressedClassSpaceSize = 1073741824 (1024.0MB)    MaxMetaspaceSize         = 17592186044415 MB    G1HeapRegionSize         = 0 (0.0MB)  Heap Usage: PS Young Generation Eden Space:    capacity = 1048576 (1.0MB)    used     = 628184 (0.5990829467773438MB)    free     = 420392 (0.40091705322265625MB)    59.908294677734375% used From Space:    capacity = 524288 (0.5MB)    used     = 491568 (0.4687957763671875MB)    free     = 32720 (0.0312042236328125MB)    93.7591552734375% used To Space:    capacity = 524288 (0.5MB)    used     = 0 (0.0MB)    free     = 524288 (0.5MB)    0.0% used PS Old Generation    capacity = 45088768 (43.0MB)    used     = 884736 (0.84375MB)    free     = 44204032 (42.15625MB)    1.9622093023255813% used  981 interned Strings occupying 64824 bytes.  $ jmap -dump:live,format=b,file=heap.bin 1354                                                                               Dumping heap to /Users/shelajev/workspace_idea/throwaway/heap.bin ... Heap dump file created

jmap 還可以簡單地觸發(fā)當前堆 dump,之后可以隨意進行分析。你可以像下面例子中的那樣,傳一個 -dump 參數(shù)給 jmap。

現(xiàn)在有了 dump 得到的文件 heap.bin,就可以用你喜歡的內(nèi)存分析工具來分析。

4、jps

jps 是顯示 Java 程序系統(tǒng)進程(PID)最常用的工具。它與平臺無關,非常好用。想象一下我們啟動了上面的程序,然后想用 jmap 連接它。這個時候我們需要程序的 PID,jps 正好的派上用場。

$ jps -mlv 5911 com.intellij.rt.execution.application.AppMain org.shelajev.throwaway.jdktools.OhMyMemory -Xmx64m -Didea.launcher.port=7535 -Didea.launcher.bin.path=/Applications/IntelliJ IDEA 14 EAP.app/Contents/bin -Dfile.encoding=UTF-8 5544  -Dfile.encoding=UTF-8 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -Djsse.enableSNIExtension=false -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -XX:+HeapDumpOnOutOfMemoryError -Xverify:none -Xbootclasspath/a:../lib/boot.jar -Xms128m -Xmx750m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=225m -XX:+UseCompressedOops -agentlib:yjpagent=probe_disable=*,disablealloc,disabletracing,onlylocal,disableexceptiontelemetry,delay=10000,sessionname=IntelliJIdea14 -Didea.java.redist=NoJavaDistribution -Didea.home.path=/Applications/IntelliJ IDEA 14 EAP.app/Contents -Didea.paths.selector=IntelliJIdea14 5930 sun.tools.jps.Jps -mlvV -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home -Xms8m

我們發(fā)現(xiàn)大多數(shù)情況下,“-mlv” 參數(shù)組合起來***用。它會打印main方法的參數(shù)、完整包名、JVM 相關參數(shù)。這樣你就可以在一大堆相似的進程中找到你想要的那個。

現(xiàn)在有了 dump 得到的文件 heap.bin,就可以用你喜歡的內(nèi)存分析工具來分析。

5、jstack

jstack 是一個生成指定 JVM 進程的線程堆棧工具。當你程序一直在那里轉(zhuǎn)圈圈,而你想找到線程到底做了什么導致死鎖,那么 jstack 最適合。

jstack 只有幾個參數(shù)選項,如果你拿不準,把它們都加上。如果后面發(fā)現(xiàn)有些信息對你意義不大時可以調(diào)整參數(shù)限制它的輸出。

-F 選項可以用來強制 dump,這在進程掛起時非常有用,-I 選項可以打印同步和鎖的信息。

$ 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. ….

上面的輸出雖然看起來簡單,但是它包含了每個線程的狀態(tài)和它當前的堆棧的信息。

jstack 非常有用,我們在日常工作中使用非常頻繁,特別是我們負責啟動停止應用服務器的測試引擎。測試工作往往不順利,jstack 可以讓我們知道 JVM 內(nèi)部的運行狀態(tài)且沒有什么負面的影響。

— Neeme Praks(ZeroTurnaround資深產(chǎn)品工程師)

還有其它的嗎?

今天我們介紹了 JDK 發(fā)行預裝的超棒工具。相信我,將來某天你肯定會用到它們中的一些。所以,如果你有時間,你可以翻一翻它們的官方文檔。

試著在不同的場景使用并愛上它們。

如果你想學一些超棒的非 JDK 附帶的工具,可以看看 JRebel ,它可以讓你馬上看到代碼的改動效果,還可以看到我們新的產(chǎn)品 XRebel ,它可以像X光眼鏡一樣掃描你的 web 應用。

如果你知道開發(fā)***實踐中至關重要的小工具,在本文末尾發(fā)表評論或者在 twitter上@shelajev 分享一下這個工具的細節(jié)。

Bonus Section: References

獎勵環(huán)節(jié):參考

下面是一個更加完整的 JDK 工具可用列表。雖然這不是一個完整的列表,為了節(jié)省篇幅,我們省掉了加密、web-services 相關的工具等。謝謝 manpagez.com 提供的資源。

  • jar — 一個創(chuàng)建和管理 jar 文件的工具。

  • java — Java 應用啟動器。在這篇文章里,開發(fā)和部署都是用的這個啟動器。

  • javac — Java 編譯器。

  • javadoc — API 文檔生成器。

  • javah — native 本地方法中用于生成 C 語言頭文件和源文件。

  • javap — class 文件反編譯器。

  • jcmd — JVM 命令行診斷工具,可發(fā)送診斷命令請求到 JVM 中。

  • jconsole — 一個兼容 JMX 的監(jiān)控 JVM 的圖形化工具??梢员O(jiān)控本地和遠程 JVM,也可以監(jiān)控和管理單獨的一個應用。

  • jdb — Java 調(diào)試器。

  • jps — JVM 進程查看工具,列出了系統(tǒng)運行的所有 hotspot JVM 進程。

  • jstat — JVM 狀態(tài)監(jiān)控工具。它可以收集和打印指定的 JVM 進程性能狀態(tài)。

  • jhat — 堆 dump 信息的瀏覽器,啟動一個 web 服務器來顯示你用諸如 jmap -dump 得到的堆 dump 信息。

  • jmap — Java 內(nèi)存映射工具,打印指定進程、核心文件、遠程調(diào)試服務器共享內(nèi)存映射或者堆內(nèi)存詳細信息。

  • jsadebugd — Java 服務調(diào)試守護進程—依附到一個 Java 進程或核心文件并且擔當一個調(diào)試服務器的作用。

  • jstack —Java 堆棧信息工具——打印指定進程或核心文件或者遠程調(diào)試服務器的線程堆棧。

  • jjs — 運行 Nashorn 命令行腳本 shell。

  • jrunscript — Java 腳本運行工具。不過你要心里有數(shù),這實際上是一個還沒支持的測試功能。未來的 JDK 版本里面可能會移除它。

以上是“java中JDK內(nèi)建工具有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI