当前位置:  开发笔记 > 编程语言 > 正文

Java内存不足自动堆转储文件名

如何解决《Java内存不足自动堆转储文件名》经验,为你挑选了2个好方法。

我有几个Java进程,我正在尝试管理发生OOM错误时创建的堆转储.当我说管理我的意思

根据原始进程以不同方式命名堆转储

删除较旧的堆转储以保留磁盘空间

使用时将堆转储到OOM上

 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp

JVM在指定的/ tmp文件夹中创建一个名为java_pidXXXX.hprof的文件(其中XXXX是进程的PID).无论如何要指定一种不同的格式,其中PID和DATE用于创建文件名?谷歌搜索了一个小时后,我尝试了myPrefix_ $,{pid},'date'等.唯一有效的两件事是

    不指定文件名,你得到java_pidXXXX.hprof

    指定静态文件名,例如\ tmp\OOM.hprof.

如果\ tmp文件夹不存在,则不会创建它,也不会创建堆转储.

可以使用的一个想法是在OOM错误上添加命令

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

但我试图避免它,因为我需要部署"doSomething.sh"



1> RealSkeptic..:

-XX:HeapDumpPath命令行上不给你任何比你已经发现了更多的灵活性.也就是说,您可以:

设置目录名称,然后java_pidXXX.hprof将在该目录中创建默认名称.

设置文件名,该文件将按原样使用.

HotSpot源代码中的相关代码是heapDumper.cpp.阅读它,它不会在给定路径中寻找任何"魔术序列":

它检查给定路径是否是目录.如果是这样,使用它作为前缀,添加文件分隔符,并使用默认文件名,该文件名由使用不受您控制的字符串格式的硬编码部分构成.

如果它不是目录,它只是按原样使用它.

如果它不是此JVM生命周期中的第一个转储,它还会附加序列号.

而已.除了确定它是否是目录之外,不解析路径.

您可以添加的唯一灵活性是在命令行上构造名称时使用shell的功能.这就是为什么你可能会在网上看到一些使用类似东西的例子name_`date`.ext- 这是由shell处理的,它`date`用当前日期替换一次.也就是说,文件名将始终具有shell处理命令并启动JVM的日期/时间 - 而不是创建转储的日期/时间.如果这对你来说足够好 - 你可以使用它.请注意,现在使用语法被认为更可接受name_$(date).ext.

如果您只需要日期以便能够删除旧文件,那么您可以根据文件的上次修改时间删除它们(Unix/Linux实用程序find可以帮助您).名称中不需要日期.

$(date)(或`date`)招不帮助你的PID.如果使用shell,shell也可以替换当前的PID $$- 但它是处理命令行shell的PID ,而不是JVM进程本身.但是,如果使用shell exec命令启动JAVA应用程序,它将获得与其源自的shell相同的进程ID,因此您实际上可以使用它$$来构建文件名.请记住,exec从脚本执行后不会执行任何操作.

因此,您可以尝试动态更改@apangin在其答案中建议的文件名.但请注意,确定转储本身的时间可能有点困难,因为您希望在OOM实际发生之前设置文件名.



2> apangin..:

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);

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有