Java 程序該怎麼優化?工具篇

程序員:為什麼程序總是那麼慢?時間都花到哪裡去了?


面試官:若你寫的 Java 程序,出現了性能問題,該怎麼去排查呢?


工欲善其事必先利其器,為你呈上一籮筐性能優化工具,必有一款滿足你,廢話不多說,直奔主題。


1. hprof 工具


hprof 工具是通過織入監控代碼,來對 Java 程序進行監控的一款工具。可以監控 Java 程序在運行時佔用的 CPU,及統計堆內存使用等。


例如:每隔 10 毫秒採樣 CPU 消耗信息,並把信息保存到 hprof.txt 文件中。

<code>java -agentlib:hprof=cpu=times,interval=10,file=hprof.txt class/<code>

指令運行完,打開 hprof.txt 便很容易統計出哪些方法的運行耗時較長。


Java 程序該怎麼優化?工具篇


例如:輸出 Java 應用程序中各個類所佔用的內存百分比。

<code>java -agentlib:hprof=heap=sites,file=hprof.txt class/<code>

打開輸出的文件,效果如下。

Java 程序該怎麼優化?工具篇


例如:將 Java 應用程序的堆快照保存在文件 core.hprof 中,然後就可以使用 VisualVM 等工具來分析這個堆文件啦。

<code>java -agentlib:hprof=heap=dump,format=b,file=core.hprof class/<code>

採用 VisualVM 工具打開 core.hprof 文件進行分析堆快照,效果如下。


Java 程序該怎麼優化?工具篇


2. JConsole 工具


JConsole 是 Java 自帶的圖形化性能監控工具,可以讓你擺脫命令行排查問題的痛苦。通過它,會非常容易的監測 Java 程序的運行情況。


Java 程序該怎麼優化?工具篇


2.1. 連接要監控的 Java 程序


首先進入 JDK 安裝之後的 bin 目錄,若是配置過 Java 的環境變量,直接運行 JConsole 就行,效果如下。


Java 程序該怎麼優化?工具篇


若是要監控本地 Java 進程,直接選擇列表中的名稱進行連接即可。


若是要監控遠程 Java 進程,需要在遠程 Java 程序啟動時,需要加上下面幾句話。

<code># 遠程服務器的ip地址
-Djava.rmi.server.hostname=127.0.0.1
# 指定jmx監聽的端口
-Dcom.sun.management.jmxremote.port=8099
# 指定jmx監聽的端口
-Dcom.sun.management.jmxremote.rmi.port=8099
# 是否開啟ssl
-Dcom.sun.management.jmxremote.ssl=false
# 是否開啟認證
-Dcom.sun.management.jmxremote.authenticate=false/<code>

若是在 IDEA 開發工具中進行驗證,按照下圖進行配置,跑程序就行。


Java 程序該怎麼優化?工具篇


若是命令行啟動時,按照下述方式配置,啟動就行。

<code>java -cp . -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=8099 -Dcom.sun.management.jmxremote.rmi.port=8099  -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false className/<code>

啟動遠程 Java 程序,JConsole 輸入遠程服務 IP 和 端口,連接即可。


Java 程序該怎麼優化?工具篇


2.2. 監控 Java 程序概況


Java 程序該怎麼優化?工具篇


如圖所示,JConosle 連接上要監控的 Java 程序後,可以很方便的查看堆內存使用量、線程數量、加載類的數量以及 CPU 的佔用率。


2.3. 內存監控


Java 程序該怎麼優化?工具篇


如圖所示,在 JConsole 提供的內存監控頁面,不僅能看到堆內存的使用情況,而且能查看非堆區的內存使用情況等等。另外,還提供了讓 Java 應用強制進行一次 GC 的功能。


2.4. 線程監控


Java 程序該怎麼優化?工具篇


如圖所示,通過 JConsole 提供的線程頁面,可以方便查看系統內的線程數量,以及程序中所有的線程,並且還能看到線程的棧信息。另外,該頁面還提供了檢測死鎖的支持,那麼就可以快速的幫我們定位死鎖的問題啦。


2.5. 類加載情況


Java 程序該怎麼優化?工具篇


如圖所示,JConsole 還能夠顯示類加載情況,包括已經裝載的類數量,以及已經卸載的類數量。


2.6. VM 摘要


Java 程序該怎麼優化?工具篇


如圖所示,JConsole 提供的 VM 概要頁面,能夠顯示當前 Java 應用程序的基本信息,包括運行環境、系統線程信息、堆信息等等。


2.7. MBean 管理


Java 程序該怎麼優化?工具篇


通過 JConsole 提供的 MBean 頁面,我們可以對應用中的 MBean 進行統一管理,鑑於之前在剖析 Resin 服務器源碼的時候,我們多次用到過,本次不再鋪開去說。


3. VisualVM 工具


Visual VM 是可以替代 jstat、jmap、jhat、jstack 命令的一款故障診斷和性能監控的可視化工具,甚至可以替代 JConsole,所以我們還是有必要進行了解一下。


3.1 連接要監控的 Java 程序


首先進入 JDK 安裝的 bin 目錄,運行 jvisualvm,啟動起來後和 JConsole 一樣,可以選擇本地和遠程進行連接,效果如下。


Java 程序該怎麼優化?工具篇


本次著重介紹一下這款工具能幹啥,如何連接 Java 程序就不帶著一起做實驗啦,不過已把操作步驟幫你梳理好了,照著做就行啦。


Java 程序該怎麼優化?工具篇


3.2 概述


Java 程序該怎麼優化?工具篇


如圖所示,通過 VisualVM 提供的概述功能頁,可以很方便的查看 Java 程序的進程 ID、JVM 參數、系統屬性等等信息。


3.3 監視


Java 程序該怎麼優化?工具篇


這塊和 JConsole 很像,VisualVM 將 CPU 使用情況、堆使用情況、類加載信息以及線程都做了圖形界面展示,可以很直觀的進行監測。


3.4 線程監控


Java 程序該怎麼優化?工具篇


VisualVM 可以展示詳細的線程信息,讓線程信息一覽無餘,並且會自動進行死鎖檢測,如果在當前程序中找到死鎖,則會提示“檢測到死鎖”。另外,通過線程 Dump可以導出當前所有線程的堆棧信息。


3.5 抽樣器


Java 程序該怎麼優化?工具篇


Visual VM 提供 CPU 和內存兩個抽樣器。通過 CPU 抽樣器,可以幫助我們快速找到程序中佔用 CPU 時間最長的方法;通過內存抽樣器,可以幫助我們查看當前程序的堆信息。


CPU抽樣器效果圖:

Java 程序該怎麼優化?工具篇


內存抽樣器效果圖:

Java 程序該怎麼優化?工具篇


3.6 Profiler


Profiler 的功能和抽樣器其實差不多,只不過抽樣器是抽樣進行檢測,而 Profiler 是全面進行檢測。


Java 程序該怎麼優化?工具篇


點擊 CPU 按鈕,效果如上圖所示,則開啟一個 CPU 性能分析會話,等 VisualVM 收集和統計完相關性能數據信息,將會顯示在性能分析結果。


Java 程序該怎麼優化?工具篇


若點擊內存按鈕,則開啟一個內存分析會話,等 VisualVM 收集和統計完相關性能數據信息,將會顯示在性能分析結果,效果如上圖所示。


3.7 快照


Java 程序該怎麼優化?工具篇


VisualVM 很多地方,都提供了快照功能,可以讓我們保存某一個時刻應用程序的堆信息、線程堆棧等等保存成快照,以便性能優化後進行對比、分析使用。


3.8 插件


Java 程序該怎麼優化?工具篇


VisualVM 還可以通過安裝插件,來實現更多可能性。


4. 寫最後


程序員編碼那是本能,但是若能更好的解決生產問題,則會彰顯個人才能。


工具一籮筐,你也別嫌多,因為總有一款適合你。但是工具說再多,若不進行實踐,一切皆枉然,紙上得來終覺淺,只有實踐才是硬道理!


有關 Java 性能分析工具,本次就分享就到這裡,希望大家能夠喜歡,喜歡就多關注「一猿小講」。下次我們將結合案例進行實踐,敬請期待。


分享到:


相關文章: