目錄java
Tomcat是一款經常使用的Web容器, 它是運行在 JVM(Java Virtual Machine) 中的一個Java進程.shell
本文以Tomcat爲例, 藉助一些JDK的工具對Tomcat在運行過程當中的內存佔用狀況進行監控, 爲優化提供數據支撐.服務器
JDK自帶的工具位於
${JAVA_HOME}/bin/
目錄下.app
JConsole 能夠簡單明瞭地查看到內存的使用狀況, 線程的狀態, 當前加載的類的總量等.jvm
JVisualVM 能夠下載插件(如GC等), 進而查看更豐富的信息. 若是是分析本地的Tomcat的話, 還能夠進行內存抽樣等, 檢查每一個類的使用狀況.工具
(1) jps 查看本地運行着的 Java 進程, 及其進程號、進程啓動的路徑等信息;
優化
(2) jmap 查看垃圾收集策略即 JVM 內存佔用狀況:.net
jmap -heap pid
# 查看垃圾收集策略, 以及堆內存的分配與使用狀況.插件
jmap -clstats pid
# 查看類加載器的統計數據 —— 此命令調用了sun.jvm.hotspot.runtime.VM.initialize()
方法, 會致使該 pid 對應的 JVM 進程阻塞.線程
jmap -histo [pid]
# 按照內存使用大小倒序列出內存中的實例類型.
(3) jstack 查看線程棧:
jstack pid
# 列出該 pid 對應 JVM 的全部線程棧描述, 主要包括每一個線程的狀態以及堆棧內各棧幀的方法全限定名、代碼位置. 注意: 這些信息的顯示只是爲了便於開發人員閱讀, 並非棧中存的就是這些信息.
(4) jstat 實時查看堆內存的使用狀況:
# 使用方法: jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] # 查看可以使用的選項: jstat –options -class # 類加載狀況的統計 -compiler # HotSpot中即時編譯器編譯狀況的統計 -gc -gccapacity # 新生代、老年代以及永久代的存儲容量狀況 -gccause -gcmetacapacity # 元數據區的容量 -gcnew # 新生代垃圾回收信息 -gcnewcapacity # 新生代的存儲容量 -gcold # 老年代垃圾回收信息 -gcoldcapacity # 老年代的存儲容量 -gcutil # 實時查看GC信息 -printcompilation # HotSpot編譯方法的統計
使用示例: 間隔5s, 每隔10條輸出一次頭信息, 打印進程號爲3308的JVM進程的堆內存使用狀況, 以及各代垃圾回收的次數及時間:
jstat -gcutil -h10 77545 5000
顯示信息以下:
參數說明:
S0: Heap上的Survivor Space 0區已使用空間的百分比 S1: Heap上的Survivor Space 1區已使用空間的百分比 E: Heap上的Eden Space區已使用空間的百分比 O: Heap上的Old Space區已使用空間的百分比 M: Meta Space(元數據區)已使用空間的百分比 YGC: 從應用程序啓動到採樣時發生Young GC的次數 YGCT: 從應用程序啓動到採樣時Young GC所用的時間(單位: 秒) FGC: 從應用程序啓動到採樣時發生Full GC的次數 FGCT: 從應用程序啓動到採樣時Full GC所用的時間(單位: 秒) GCT: 從應用程序啓動到採樣時用於垃圾回收的總時間(單位: 秒)
能夠經過配置JVM的啓動參數, 打印類的加載狀況及對象的回收信息, 能夠打印到屏幕或指定文件中, 默認也會打印到catalina.log中. Tomcat容器的JVM啓動參數配置文件是: ${TOMCAT_HOME}/bin/catalina.sh
, 具體參數以下:
-verbose:gc # 在輸出設備顯示垃圾收集信息(JVM發生內存回收時輸出相關信息) -XX:+PrintGC # 輸出GC日誌, 形式: Full GC 118250K->113543K(130112K), 0.0094143 secs -XX:+PrintGCDetails # 輸出GC詳細日誌, 形式: GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs[Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs] -XX:+PrintGCTimeStamps # 輸出GC的時間戳, 以基準時間的形式輸出: 11.851: [GC 98328K->93620K(130112K), 0.0082960 secs], 11.851是JVM啓動後的秒數. -XX:+PrintGCDateStamps # 輸出GC的時間戳, 以日期的形式輸出: 2018-08-28T21:53:59.234+0800 -XX:+PrintGCApplicationStoppedTime # 打印垃圾回收期間程序暫停的時間, 即GC消耗的時間. 可與上面混合使用. # 輸出形式: Total time for which application threads were stopped: 0.0468229 seconds -XX:+PrintGCApplicationConcurrentTime # 打印每次垃圾回收前, 程序未中斷的執行時間, 即相鄰2次GC的間隔. # 能夠和上面的配置混合使用. 輸出形式: Application time: 0.5291524 seconds -XX:+PrintTenuringDistribution # 觀察各個Age的對象總大小 -XX:PrintHeapAtGC # 打印GC先後的詳細堆棧信息 -XX:+HeapDumpOnOutOfMemoryError # 發生OOM時自動dump堆棧信息, 以便後續分析 -Xloggc:../logs/gc.log # 與上面選項配合使用, 將日誌信息輸出到指定的文件以便後續分析
對部署在局域網內其餘服務器上的Tomcat, 能夠打開JMX監控端口, 就能夠在另外的服務器上經過該端口查看經常使用的參數(一些比較複雜的功能不支持).
配置方法: 一樣是在JVM啓動參數中配置, 配置以下:
-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=172.16.11.62 # 設置JVM的JMS監聽的IP地址, 防止錯誤監聽爲本機127.0.0.1地址 -Dcom.sun.management.jmxremote.port=1090 # 設置JVM的JMS監控的端口 -Dcom.sun.management.jmxremote.ssl=false # 設置JVM的JMS監控不實用SSL -Dcom.sun.management.jmxremote.authenticate=false # 設置JVM的JMS監控不須要認證
參考資料
版權聲明
做者: 馬瘦風
出處: 博客園 馬瘦風的博客
您的支持是對博主的極大鼓勵, 感謝您的閱讀.
本文版權歸博主全部, 歡迎轉載, 但請保留此段聲明, 並在文章頁面明顯位置給出原文連接, 不然博主保留追究相關人員法律責任的權利.