【JVM譯文】JVM問題定位前的準備工作有哪些
一、序
最近在學習jvm工具時,不少鏈接直指oracle官網。才發現有不少好東西。
本文翻譯自:
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/prepapp002.html
二、正文
這一節描述如何設置環境及JVM選項,以方便收集定位問題時的相關數據。
1、開啟core文件轉儲
如果java崩潰,比如因為一個段錯誤,系統將在磁盤上留下一份線索(core文件,也叫核心轉儲,是內存的完整dump)。在Linux和Solaris,core文件有時默認是被禁止的。
要開啟對core文件的支持,通常只需要運行命令 ulimit -c unlimited。當然,這需要在程序啟動之前。(有些系統可能方式不同)
註意:core文件占用大量的磁盤空間,尤其是分配的java 堆很大的情況下。
要決定是否允許core文件,考慮下如果你的系統崩潰了你會做什麽。是否會想要一覽core文件呢?很多java用戶看core文件也沒多大用處。然而,如果你想要debug一個發生在gdb中的可能的崩潰,
那麽確保在程序啟動前你開啟了core文件支持。
很多時候,崩潰很難復現;因此,在程序啟動前開啟core支持。
2、增加 -XX:+HeapDumpOnOutOfMemoryError 到JVM選項中
-XX:+HeapDumpOnOutOfMemoryError 在程序遇到OutOfMemoryError時,生成一會java的堆轉儲到磁盤上。使用jhat工具去檢查java的堆,找出哪個對象占用了最多的恐懼,然後
核查那些本來應該已經死亡的卻還活下來的對象。
就像core文件一樣,堆轉儲可能很大,尤其java運行堆很大的情況下。
再說一次,考慮下如果程序遇到OutOfMemoryError你會怎麽處理。難道不希望檢查錯誤發生時的堆文件嗎?因此,打開這個參數,因此程序內存溢出時,你能得到堆轉儲數據。
3、運行一個持續的Java Flight recording。
這個不太懂。大家先看原文吧。等我琢磨出來了再補充。
4、增加-verbosegc 到jvm選項
-verbosegc 記錄關於java垃圾收集器的基礎信息。這能幫助你發現以下問題:
- 垃圾收集是否運行了很長一段時間?
- 可用內存是不是在隨著時間降低
垃圾收集器幫助分析問題,當程序拋出內存溢出異常時,或者程序遇到性能問題。
註意:使用日誌輪轉,好讓程序重啟後不會刪除之前的日誌。從jdk7後,UseGClogFileRotation
和NumberOfGCLogFiles 參數可以用來
設置日誌輪轉。關於這些的細節,可以查看“jvm的debug選項”
5、打印java版本和jvm參數
在提交一個bug或者從論壇尋求幫助前,獲取基礎信息。比如,打印出java版本和jvm選項就很有用。
如果你的程序是從腳本啟動,運行java -version打印java版本,打印命令行參數。另外一個可選方案是
添加-XX:+PrintCommandLineFlags 和-showversion到JVM的啟動參數。
註:我自己在tomcat試了下,修改了catalina.bat:
啟動,如下(這有個問題,這東西只打印到console了,沒法寫入日誌啊,有知道的同學嗎):
6、開啟jmc jmx來進行遠程監控
JMX可以連接到遠程的java應用,通過Mission Control或者Visual VM。除非你能在本機(要監控的java程序所在的機器)運行你的這些工具,否則開啟jmc jmx對你以後會很有用。
開啟JMX沒有什麽性能負擔。
具體可以查看 “怎麽開啟JMX監控”
當一個程序已經啟動了的話,再去開啟jmx監控的辦法是:使用ManagementAgent.start命令。運行jcmd <pid> help ManagementAgent.start 查看該命令的選項。
jcmd的更多細節,可以查看“jcmd工具”。
【JVM譯文】JVM問題定位前的準備工作有哪些