簡體   English   中英

Java內存不足自動堆轉儲文件名

[英]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'等。 唯一有效的兩件事是

  1. 不指定文件名,你得到java_pidXXXX.hprof
  2. 指定靜態文件名,例如\\ tmp \\ OOM.hprof。

如果\\ tmp文件夾不存在,則不會創建它,也不會創建堆轉儲。

可以使用的一個想法是在OOM錯誤上添加命令

-XX:OnOutOfMemoryError="doSomething.sh %p"

但我試圖避免它,因為我需要部署“doSomething.sh”

命令行上的-XX:HeapDumpPath不會比您已經發現的更靈活。 也就是說,您可以:

  • 設置目錄名稱,然后將在該目錄中創建默認名稱java_pidXXX.hprof
  • 設置文件名,該文件將按原樣使用。

HotSpot源代碼中的相關代碼是heapDumper.cpp 閱讀它,它不會在給定路徑中尋找任何“魔術序列”:

  • 它檢查給定路徑是否是目錄。 如果是這樣,使用它作為前綴,添加文件分隔符,並使用默認文件名,該文件名由使用不受您控制的字符串格式的硬編碼部分構成。
  • 如果它不是目錄,它只是按原樣使用它。
  • 如果它不是此JVM生命周期中的第一個轉儲,它還會附加序列號。

而已。 除了確定它是否是目錄之外,不解析路徑。

您可以添加的唯一靈活性是在命令行上構造名稱時使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM