[英]Java Out of memory automatic heap dump file name
我有幾個Java進程,我正在嘗試管理發生OOM錯誤時創建的堆轉儲。 當我說管理我的意思
使用時將堆轉儲到OOM上
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp
JVM在指定的/ tmp文件夾中創建一個名為java_pidXXXX.hprof的文件(其中XXXX是進程的PID)。 無論如何要指定一種不同的格式,其中PID和DATE用於創建文件名? 谷歌搜索了一個小時后,我嘗試了myPrefix_ $,{pid},'date'等。 唯一有效的兩件事是
如果\\ tmp文件夾不存在,則不會創建它,也不會創建堆轉儲。
可以使用的一個想法是在OOM錯誤上添加命令
-XX:OnOutOfMemoryError="doSomething.sh %p"
但我試圖避免它,因為我需要部署“doSomething.sh”
命令行上的-XX:HeapDumpPath
不會比您已經發現的更靈活。 也就是說,您可以:
java_pidXXX.hprof
。 HotSpot源代碼中的相關代碼是heapDumper.cpp 。 閱讀它,它不會在給定路徑中尋找任何“魔術序列”:
而已。 除了確定它是否是目錄之外,不解析路徑。
您可以添加的唯一靈活性是在命令行上構造名稱時使用shell的功能。 這就是為什么你可能會在網上看到一些使用name_`date`.ext
類的name_`date`.ext
- 這是由shell處理的,它將`date`
替換為當前日期一次 。 也就是說,文件名將始終具有shell處理命令並啟動JVM的日期/時間 - 而不是創建轉儲的日期/時間。 如果這對你來說足夠好 - 你可以使用它。 請注意,現在使用語法name_$(date).ext
更可接受。
如果您只需要日期以便能夠刪除舊文件,那么您可以根據文件的上次修改時間刪除它們(Unix / Linux實用程序find
可以幫助您)。 名稱中不需要日期。
$(date)
(或`date`
)技巧對PID沒有幫助。 如果使用$$
,shell也可以替換當前的PID - 但它是處理命令行的shell的PID,而不是JVM進程本身。 但是,如果使用shell exec
命令啟動JAVA應用程序,它將獲得與其源自的shell相同的進程ID,因此您實際上可以使用$$
來構建文件名。 請記住, exec
之后的任何內容都不會從您的腳本中執行。
因此,您可以嘗試動態更改@apangin在其答案中建議的文件名。 但請注意,確定轉儲本身的時間可能有點困難,因為您希望在OOM實際發生之前設置文件名。
HeapDumpPath
是一個可管理的VM選項。 這意味着您可以使用JMX將其設置為運行時所需的任何內容。
String pid = ManagementFactory.getRuntimeMXBean().getName();
pid = pid.substring(0, pid.indexOf('@'));
String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String fileName = "/tmp/heap_" + pid + "_" + date + ".dump";
HotSpotDiagnosticMXBean bean = ManagementFactory.newPlatformMXBeanProxy(
ManagementFactory.getPlatformMBeanServer(),
"com.sun.management:type=HotSpotDiagnostic",
HotSpotDiagnosticMXBean.class);
bean.setVMOption("HeapDumpOnOutOfMemoryError", "true");
bean.setVMOption("HeapDumpPath", fileName);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.