天天看點

通過 JDK 常用工具監控 Java 程序的記憶體占用情況

本篇博文比較詳細地說明了 JDK 的常用工具、GC 日志資訊的檢視、JMS 遠端監控的使用等内容,可供初步學習 JVM 優化的開發人員參考。

目錄

1 JDK 工具的使用

2 檢視 GC 日志資訊

3 添加 JMS 遠端監控

參考資料

版權聲明

Tomcat是一款常用的Web容器, 它是運作在 JVM(Java Virtual Machine) 中的一個Java程序. 本文以Tomcat為例, 借助一些JDK的工具對Tomcat在運作過程中的記憶體占用情況進行監控, 為優化提供資料支撐.
JDK自帶的工具位于<code>${JAVA_HOME}/bin/</code>目錄下.

JConsole 可以簡單明了地檢視到記憶體的使用情況, 線程的狀态, 目前加載的類的總量等.

JVisualVM 可以下載下傳插件(如GC等), 進而檢視更豐富的資訊. 如果是分析本地的Tomcat的話, 還可以進行記憶體抽樣等, 檢查每個類的使用情況.

(1) jps 檢視本地運作着的 Java 程序, 及其程序号、程序啟動的路徑等資訊;

通過 JDK 常用工具監控 Java 程式的記憶體占用情況

(2) jmap 檢視垃圾收集政策即 JVM 記憶體占用情況:

<code>jmap -heap pid</code> # 檢視垃圾收集政策, 以及堆記憶體的配置設定與使用情況. <code>jmap -clstats pid</code> # 檢視類加載器的統計資料 —— 此指令調用了<code>sun.jvm.hotspot.runtime.VM.initialize()</code> 方法, 會導緻該 pid 對應的 JVM 程序阻塞. <code>jmap -histo [pid]</code> # 按照記憶體使用大小倒序列出記憶體中的執行個體類型.

(3) jstack 檢視線程棧:

<code>jstack pid</code> # 列出該 pid 對應 JVM 的所有線程棧描述, 主要包括每個線程的狀态以及堆棧内各棧幀的方法全限定名、代碼位置. 注意: 這些資訊的顯示隻是為了便于開發人員閱讀, 并不是棧中存的就是這些資訊.

(4) jstat 實時檢視堆記憶體的使用情況:

使用示例: 間隔5s, 每隔10條輸出一次頭資訊, 列印程序号為3308的JVM程序的堆記憶體使用情況, 以及各代垃圾回收的次數及時間:

jstat -gcutil -h10 77545 5000

顯示資訊如下:

通過 JDK 常用工具監控 Java 程式的記憶體占用情況

參數說明:

可以通過配置JVM的啟動參數, 列印類的加載情況及對象的回收資訊, 可以列印到螢幕或指定檔案中, 預設也會列印到catalina.log中. Tomcat容器的JVM啟動參數配置檔案是: <code>${TOMCAT_HOME}/bin/catalina.sh</code>, 具體參數如下:

對部署在區域網路内其他伺服器上的Tomcat, 可以打開JMX監控端口, 就可以在另外的伺服器上通過該端口檢視常用的參數(一些比較複雜的功能不支援).

配置方法: 同樣是在JVM啟動參數中配置, 配置如下:

JVM 運作時記憶體使用情況監控
作者: 馬瘦風 出處: 部落格園 馬瘦風的部落格 您的支援是對部落客的極大鼓勵, 感謝您的閱讀. 本文版權歸部落客所有, 歡迎轉載, 但請保留此段聲明, 并在文章頁面明顯位置給出原文連結, 否則部落客保留追究相關人員法律責任的權利.