《深刻理解Java虛擬機:JVM高級特性與最佳實踐(第二版》讀書筆記與常見面試題總結java
本節常見面試題(推薦帶着問題閱讀,問題答案在文中都有提到):面試
JVM調優的常見命令行工具備哪些?瀏覽器
給一個系統定位問題的時候,知識、經驗是關鍵基礎,數據是依據,工具是運用知識處理數據的手段。常常 使用適當的虛擬機監控和分析工具能夠加速咱們分析數據、定位解決問題的速度,但在學習工具前,也應當意識到工具永遠都是知識技能的一層包裝,並無什麼工具是「祕密武器」,不可能學會了就能包治百病。服務器
下面這些命令行工具java.exe以及javac.exe咱們都很熟悉了,下面咱們主要看看其餘命令行工具的做用。
微信
JDK的不少小工具的名字都參考了UNIX命令的命名方式,jps(JVM Process Status) 是其中的典型。除了名字像UNIX的ps命令外,它的功能也和ps命令相似:能夠列出正在運行的虛擬機進程,並顯示虛擬機執行主類名稱以及這些進程的本地虛擬機惟一ID(Local Virtual Machine Identifier,LVMID)。雖然功能比較單一,但它是使用最高的JDK命令行工具,由於其餘的JDK工具大多須要輸入它查詢到的LVMID來肯定要監控的是哪個虛擬機進程。工具
jps的經常使用功能選項:
性能
測試:
上面輸出了我正在運行程序的包名下的類名:
學習
jstat(JVM Statistics Monitoring Tool) 使用於監視虛擬機各類運行狀態信息的命令行工具。 它能夠顯示本地或者遠程(須要遠程主機提供RMI支持)虛擬機進程中的類信息、內存、垃圾收集、JIT編譯等運行數據,在沒有GUI,只提供了純文本控制檯環境的服務器上,它將是運行期間定位虛擬機性能問題的首選工具。測試
jstat主要工具選項:
測試:
操作系統
jinfo(Configuration Info for Java) 的做用是實時地查看和調整虛擬機各項參數。 使用jps命令的-v能夠查看虛擬機啓動時顯式指定的參數列表,但若是想知道未被顯式指定的參數的系統默認值,可使用jinfo的-flag選項進行查詢,jinfo還可使用-sysprops選項把虛擬機進程的System.getProperties()的內容打印出來。
測試:
jmap(Memory Map for Java)命令用於生成堆轉儲快照。 若是不使用jmap命令,要想獲取Java堆轉儲,可使用「-XX:+HeapDumpOnOutOfMemoryError」參數,可讓虛擬機在OOM異常出現以後自動生成dump文件,Linux命令下能夠經過kill -3發送進程退出信號也能拿到dump文件。
jmap的做用並不只僅是爲了獲取dump文件,它還能夠查詢finalize執行隊列、Java堆和永久代的詳細信息,如空間使用率、當前使用的是哪一種收集器等。和jinfo同樣,jmap有很多功能在Windows平臺下也是受限制的,除了生成dump文件的-dump選項和用於查看每一個類的實例、空間佔用統計的-histo選項在全部操做系統都提供以外,其他選項都只能在Linux和Solaris系統下使用。
jstack(Stack Trace for Java)命令用於生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合.
生成線程快照的目的主要是定位線程長時間出現停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間等待等都是致使線程長時間停頓的緣由。線程出現停頓的時候經過jstack來查看各個線程的調用堆棧,就能夠知道沒有響應的線程到底在後臺作些什麼事情,或者在等待些什麼資源。**
JConsole和VisualVM是兩個功能強大的可視化工具。
從Java 5開始 引入了 JConsole,JConsole 是一個內置 Java 性能分析器。您能夠輕鬆地使用 JConsole(或者,它更高端的 「近親」 jvisualvm )來監控 Java 應用程序性能和跟蹤 Java 中的代碼。(推薦使用升級版 JConsole 即 jvisualvm 。)
控制檯啓動或者直接雙擊可執行程序。
以下圖所示(這裏就不具體介紹某一點了):
咱們再來看看jvisualvm
歡迎關注個人微信公衆號:」Java面試通關手冊」(一個有溫度的微信公衆號,期待與你共同進步~~~堅持原創,分享美文,分享各類Java學習資源):