1. 程式人生 > >【JVM譯文】JVM問題定位前的準備工作有哪些

【JVM譯文】JVM問題定位前的準備工作有哪些

print 圖片 files 機器 ali 你會 cat 方便 pdu

一、序

最近在學習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後,UseGClogFileRotationNumberOfGCLogFiles 參數可以用來

設置日誌輪轉。關於這些的細節,可以查看“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問題定位前的準備工作有哪些