日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
普通Java程序員學習使用的6個JDK內(nèi)建工具

  

成都創(chuàng)新互聯(lián)公司服務項目包括汶上網(wǎng)站建設、汶上網(wǎng)站制作、汶上網(wǎng)頁制作以及汶上網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,汶上網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到汶上省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

與你的問題不同,我認為軟件工程主要是用來解決問題的。有些博客認為“每個小孩都應該學習編程”,“你認為學數(shù)學只是玩玩而已?如果你有看過我的HTML5調(diào)試器的話,你會發(fā)現(xiàn)我是一個程序員,但我做的工作遠不止數(shù)學這些”。 上面兩者都同意一個觀點,軟件工程不只是用計算機語言寫的一些只言片語。軟件解決的問題詮釋了程序員的價值。

解決問題的最終進展來自科學、強化清晰的頭腦和我們一路以來使用的工具。

你有沒有留意過那些 JDK 安裝附帶的工具?既然那些大牛同意把那些工具加到 JDK 里,應該是有用的。

因此,在這篇文章里,我挑了幾個 Hotspot 標準安裝后可用的小工具來介紹。我們決定忽略那些安全相關(guān)的和各種遠程方法調(diào)用(RMI)、applets、web-start、web-services 工具。讓我們把焦點放在那些普通開發(fā)者開發(fā)一般應用過程中可能有用的工具。注意,如果你只是對命令行工具感興趣,而不僅僅是Java相關(guān)的工具,這里介紹了 5 個非常有用的命令行工具。

再次重申,下面雖然不是 JDK 工具完整列表,但是我們想給你一個精華版本。下面是你用這些命令可以完成的真正有用的事情。

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

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

1、jjs

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

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

2、jhat

Java堆分析工具(jhat)正如它名字描述的那樣:分析dump堆信息。在下面的小例子里,我們構(gòu)造了一個 OutOfMemoryError ,然后給這個 java 進程指定 -XX:+HeapDumpOnOutOfMemoryError ,這樣運行時就會產(chǎn)生一個 dump 文件供我們分析。

 
 
  1. public class OhMyMemory { 
  2.  
  3. private static Map map = new HashMap<>(); 
  4.  
  5. public static void main(String[] args) { 
  6.    Runtime.getRuntime().addShutdownHook( 
  7.      new Thread() { 
  8.        @Override 
  9.        public void run() { 
  10.          System.out.println("We have accumulated " + map.size() + " entries"); 
  11.        } 
  12.      } 
  13.    ); 
  14.    for(int i = 0; ;i++) { 
  15.      map.put(Integer.toBinaryString(i), i); 
  16.    } 

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

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

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

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

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

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

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

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

3、jmap

jmap 是一個內(nèi)存映射工具,它提供了另外一種不需要引發(fā) OutOfMemoryErrors 就可以獲取堆 dump 文件的方法。我們稍微修改一下上面的程序看一下效果。

 
 
  1. public class OhMyMemory { 
  2.  
  3. private static Map map = new HashMap<>(); 
  4.  
  5. public static void main(String[] args) { 
  6.    Runtime.getRuntime().addShutdownHook( 
  7.      new Thread() { 
  8.        @Override 
  9.        public void run() { 
  10.          try { 
  11.            System.out.println("Enter something, so I'll release the process"); 
  12.            System.in.read(); 
  13.            System.out.println("We have accumulated " + map.size() + " entries"); 
  14.          } 
  15.          catch (IOException e) { 
  16.            e.printStackTrace(); 
  17.          } 
  18.        } 
  19.      } 
  20.    ); 
  21.  
  22.    for(int i = 0; i < 10000 ;i++) { 
  23.      map.put(Integer.toBinaryString(i), i); 
  24.    } 

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

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

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

 
 
  1. $ jmap -heap 1354                                                                                                                   
  2. Attaching to process ID 1354, please wait... 
  3. Debugger attached successfully. 
  4. Server compiler detected. 
  5. JVM version is 25.0-b70 
  6.  
  7. using thread-local object allocation. 
  8. Parallel GC with 4 thread(s) 
  9.  
  10. Heap Configuration: 
  11.    MinHeapFreeRatio         = 40 
  12.    MaxHeapFreeRatio         = 70 
  13.    MaxHeapSize              = 67108864 (64.0MB) 
  14.    NewSize                  = 1572864 (1.5MB) 
  15.    MaxNewSize               = 22020096 (21.0MB) 
  16.    OldSize                  = 45088768 (43.0MB) 
  17.    NewRatio                 = 2 
  18.    SurvivorRatio            = 8 
  19.    MetaspaceSize            = 21807104 (20.796875MB) 
  20.    CompressedClassSpaceSize = 1073741824 (1024.0MB) 
  21.    MaxMetaspaceSize         = 17592186044415 MB 
  22.    G1HeapRegionSize         = 0 (0.0MB) 
  23.  
  24. Heap Usage: 
  25. PS Young Generation 
  26. Eden Space: 
  27.    capacity = 1048576 (1.0MB) 
  28.    used     = 628184 (0.5990829467773438MB) 
  29.    free     = 420392 (0.40091705322265625MB) 
  30.    59.908294677734375% used 
  31. From Space: 
  32.    capacity = 524288 (0.5MB) 
  33.    used     = 491568 (0.4687957763671875MB) 
  34.    free     = 32720 (0.0312042236328125MB) 
  35.    93.7591552734375% used 
  36. To Space: 
  37.    capacity = 524288 (0.5MB) 
  38.    used     = 0 (0.0MB) 
  39.    free     = 524288 (0.5MB) 
  40.    0.0% used 
  41. PS Old Generation 
  42.    capacity = 45088768 (43.0MB) 
  43.    used     = 884736 (0.84375MB) 
  44.    free     = 44204032 (42.15625MB) 
  45.    1.9622093023255813% used 
  46.  
  47. 981 interned Strings occupying 64824 bytes. 
  48.  
  49. $ jmap -dump:live,format=b,file=heap.bin 1354                                                                               
  50. Dumping heap to /Users/shelajev/workspace_idea/throwaway/heap.bin ... 
  51. Heap dump file created 

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

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

4、jps

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

 
 
  1. $ jps -mlv 
  2. 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 
  3. 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 
  4. 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 相關(guān)參數(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 選項可以打印同步和鎖的信息。

 
 
  1. $ jstack -F -l 9153 
  2. Attaching to process ID 9153, please wait... 
  3. Debugger attached successfully. 
  4. Server compiler detected. 
  5. JVM version is 25.0-b70 
  6. Deadlock Detection: 
  7.  
  8. No deadlocks found. 
  9. …. 

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

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

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

還有其它的嗎?

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

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

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

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

Bonus Section: References

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

下面是一個更加完整的 JDK 工具可用列表。雖然這不是一個完整的列表,為了節(jié)省篇幅,我們省掉了加密、web-services 相關(guān)的工具等。謝謝 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 的圖形化工具。可以監(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 版本里面可能會移除它。

希望上面的內(nèi)容對你們有幫助,你可以在 twitter 上 @ shelajev留下你寶貴的評論。如果你知道一些我沒有提及的重要工具,請讓我知道。

 


當前題目:普通Java程序員學習使用的6個JDK內(nèi)建工具
轉(zhuǎn)載來于:http://www.dlmjj.cn/article/cdehjip.html