JVM問題排查步驟
1、執行jps命令檢視服務程式是否還存在:jps -lv
2、執行top命令檢視CPU和記憶體使用率。若發現有一或多個CPU或記憶體的使用率居高不下(例如80%~100%),且是Java相關程式引起的,若不是則排查其他問題,如系統問題。用docker執行top命令報錯“TERM environment variable not set.”,解決辦法是:在執行top時加上 -b引數。top -bc | top -b [pid]。
3、執行top (-b) -Hp ${pid} (d命令指定每兩次螢幕資訊重新整理之間的時間間隔。步驟2中cpu或記憶體使用率過高的Java程式號)。若是介面反應慢問題,則可在此時請求介面,觀察得到持續佔用CPU或記憶體使用率過高的執行緒號(用於後續步驟5)。
3.1、若cpu使用率過高,執行jstack ${pid} > jstack.log (步驟2中pid程式號)。得到該Java程式的執行緒快照jstack.log。
3.1.1、執行less jstack.log ,將之前有問題的(步驟3中)執行緒號轉換為16進位制,線上程快照中查詢到該執行緒,輸入: /16進位制執行緒號(printf "%x\n" 可以得到16進位制數) enter ,檢視其執行緒相關資訊,
查詢與本服務密切相關的資訊(如自定義類),確定問題所在行,解決問題,重試。
若發現是JVM的垃圾回收執行緒。再搜尋整個檔案,沒有被死鎖的執行緒。於是懷疑記憶體沒有正確釋放,JAVA程式已使用的記憶體,已經達到了分配給JVM的最大記憶體。導致垃圾回收頻繁執行FullGC,佔用了CPU。
執行jstat -gccasue ${pid} ${refresh time} 若發現年輕代,老年代記憶體使用率太高。進一步證實之前的懷疑。jstat使用詳解
3.2、若記憶體使用率過高,執行jmap -histo:live ${pid} | head -10 ,若還不能確定造成記憶體洩漏的類, 則執行jmap -dump:format=b,file=${dumpFileName} ${pid} 得到當前記憶體快照。
4. 使用eclipse的memory analyzer匯入記憶體快照,進行分析。找出記憶體異常的物件。
5. 修改程式的BUG。
6. BUG修復以後,繼續定時獲取記憶體快照,持續觀察。直到徹底解決問題。
若是自己熟悉的程式碼,通過業務日誌與直覺往往也能比較快的定位到問題,很多次都是相信直覺,對於心中對程式碼有比較熟悉的基礎上。
具體測試例子:subao-product 記憶體(MB):700~700 ,啟動命令:java -jar -Xms350m -Xmx350m -XX:-UseAdaptiveSizePolicy -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/alidata1/admin/subao-product/heapdump.hprof subao-product.jar
相關文章
- Linux排查JVM問題LinuxJVM
- 使用jvm工具排查系統問題JVM
- JVM堆外記憶體問題排查JVM記憶體
- JVM 常見線上問題 → CPU 100%、記憶體洩露 問題排查JVM記憶體洩露
- Linux雲主機安全入侵排查步驟Linux
- 解決Oracle死鎖問題步驟Oracle
- Problem E - Steps(問題e-步驟)
- JVM執行緒和記憶體溢位問題排查思路JVM執行緒記憶體溢位
- 技能篇:linux服務效能問題排查及jvm調優思路LinuxJVM
- java問題排查Java
- 框架問題排查框架
- 磁碟佔用高問題如何排查?三步教你搞定
- kubernetesgraceperiod失效問題排查
- SDK與問題排查
- 關於dataguard出現問題的檢查步驟
- Linux定時任務Crontab不起作用的排查步驟Linux
- 使用隱含引數testMappingSpeed排查GoldenGate抽取慢的步驟APPGo
- Flutter-安裝步驟及安裝遇到的問題Flutter
- JavaScript 專案遷移到 TypeScript 步驟以及遇到的問題JavaScriptTypeScript
- Java服務.問題排查.問題復現Java
- 異常問題排查之旅
- Redis阻塞問題排查方向Redis
- Spark學習——問題排查Spark
- 利用greys排查java問題Java
- 資料問題排查思路
- Kubernetes 問題排查全景圖
- redis connect timeout問題排查Redis
- 線上FullGC問題排查實踐——手把手教你排查線上問題GC
- 11個步驟完美排查Linux機器是否已經被入侵Linux
- JAVA死鎖排查-效能測試問題排查思路Java
- JVM問題及解答JVM
- JVM問題定位工具JVM
- JVM 問題分析思路JVM
- DKhadoop安裝配置步驟教程與常見問題解決Hadoop
- 編譯Spring原始碼的步驟及一些問題編譯Spring原始碼
- jvm常問問題目錄JVM
- 問題排查之RocketMQAutoConfiguration not loaded.MQ
- SpringBoot Seata 死鎖問題排查Spring Boot