成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

普通Java程序員學習使用的6個JDK內建工具

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

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

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

推薦普通開發者學習使用的6個JDK內建工具

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

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

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

0、javap

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

  • -I – 打印行數和局部變量

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

  • -c – 打印方法字節碼

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

javap -l -c -p Util2

推薦普通開發者學習使用的6個JDK內建工具

當調試類內部信息或者研究隨機字節碼順序時,javap 非常有用。

1、jjs

推薦普通開發者學習使用的6個JDK內建工具

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

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

2、jhat

Java堆分析工具(jhat)正如它名字描述的那樣:分析dump堆信息。在下面的小例子里,我們構造了一個 OutOfMemoryError ,然后給這個 java 進程指定 -XX:+HeapDumpOnOutOfMemoryError ,這樣運行時就會產生一個 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.    } 

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

運行這段代碼會產生如下輸出:

  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 

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

  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 的數據。

推薦普通開發者學習使用的6個JDK內建工具

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

推薦普通開發者學習使用的6個JDK內建工具

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

3、jmap

jmap 是一個內存映射工具,它提供了另外一種不需要引發 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.    } 

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

因此你可以用 jmap 的兩個功能來實現,獲取堆統計信息和觸發一個堆 dump。因此,當執行:

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

 

  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 還可以簡單地觸發當前堆 dump,之后可以隨意進行分析。你可以像下面例子中的那樣,傳一個 -dump 參數給 jmap。

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

4、jps

jps 是顯示 Java 程序系統進程(PID)最常用的工具。它與平臺無關,非常好用。想象一下我們啟動了上面的程序,然后想用 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 

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

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

5、jstack

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

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

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

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

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 版本里面可能會移除它。

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

責任編輯:王雪燕 來源: ImportNew
相關推薦

2016-01-31 09:47:13

Java程序員構建工具

2021-02-05 17:42:44

Java程序員開發工具

2020-10-05 21:13:37

程序員技能開發者

2012-11-12 09:35:24

開發工具程序員IE6

2015-08-12 14:39:47

程序員問題

2015-10-30 09:49:30

2016-06-08 14:01:25

程序員軟技能

2020-08-12 08:04:26

Java技術開發

2021-05-25 16:34:06

JavaScript前端

2011-11-25 09:56:45

Java程序員

2016-01-28 14:39:04

大數據工具

2018-08-28 15:30:54

編程語言Python日志系統

2017-08-11 16:40:21

2017-04-05 11:28:53

2022-10-24 09:00:47

畫圖工具程序員XMind

2019-11-07 09:30:35

框架JavaWeb

2025-01-21 07:48:28

2021-01-12 22:33:57

程序員開發編程

2019-02-26 09:55:52

Java開發工具

2016-07-27 13:16:16

程序員編程英語
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩中文字幕在线 | 国产真实精品久久二三区 | 精品成人 | 羞羞午夜 | 欧美日韩综合视频 | 国产精品久久精品 | 日韩黄色小视频 | 亚洲精品一区在线观看 | 国产一区二区精品在线 | 在线一区二区观看 | 欧美精品一区二区三区在线四季 | 成人网av | 视频在线一区二区 | 久久毛片网站 | 自拍视频在线观看 | 国产精品美女www | 国产精品福利网 | 99re热精品视频 | 日韩精品久久 | 亚洲视频在线观看 | 国产极品粉嫩美女呻吟在线看人 | 国产jizz女人多喷水99 | 国产高清在线 | 国产一区二区三区亚洲 | 少妇av片 | 国产成人精品区一区二区不卡 | 国产日韩一区二区三免费高清 | 中国黄色毛片视频 | 国产精品一区二区av | 99热这里都是精品 | 国产成人精品一区二三区在线观看 | 精品一二区 | 国产精品自拍视频网站 | 久久久九九 | 久久久久久亚洲精品 | 国产成人精品av | 精品国产不卡一区二区三区 | 欧美一级大片 | 国产精品一区二区三区在线 | 日本亚洲精品成人欧美一区 | 日本免费一区二区三区四区 |