记录java outofmemoryerror stacktrace控制台输出

记录java outofmemoryerror stacktrace控制台输出,java,logging,out-of-memory,Java,Logging,Out Of Memory,我在JAVA程序中遇到了OutOfMemoryError。 OutOfMemoryError发生是可以的,但我希望在它发生时记录它。 我使用了-XX:OnOutOfMemoryError选项来检测它的发生,但它不会记录打印到控制台的stacktrace信息。 我尝试使用重定向来记录此控制台输出,但2>&1,2>和所有其他选项都未能记录此输出,它只是打印到控制台。 有没有办法记录此stacktrace信息? 我一直在stackoverflow.com上搜索,但找不到答案。 请给我一些建议 堆转储

我在JAVA程序中遇到了OutOfMemoryError。 OutOfMemoryError发生是可以的,但我希望在它发生时记录它。 我使用了-XX:OnOutOfMemoryError选项来检测它的发生,但它不会记录打印到控制台的stacktrace信息。 我尝试使用重定向来记录此控制台输出,但2>&1,2>和所有其他选项都未能记录此输出,它只是打印到控制台。 有没有办法记录此stacktrace信息? 我一直在stackoverflow.com上搜索,但找不到答案。 请给我一些建议

  • 堆转储也不是我的选择。 我没有这么多空间,所以不能冒险使用这么大的文件:'( 我只需要记录stacktrace信息
谢谢!

  • 选项1: 您可以使用
    OnAutofMemoryError
    hook结合jstack来获取流程的stacktrace:

    “-XX:OnOutOfMemoryError=jstack-l%p”

    注意:在生产环境中,为了避免来自不同java版本的jstack出现问题,您很可能会有单独的shell脚本

  • 选项2: 您可以使用
    setUncaughtExceptionHandler
    捕获所有异常并检查
    OutOfMemoryError
    ,具体如下:

    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
    
            @Override
            public void uncaughtException(Thread thread, Throwable ex) {
    ...
    

你在什么平台上?@WhiteViking我在使用linux:)可能是@MickMememonic的副本谢谢你的回答。我忘记提了,但HeapDump也不是我的选择仅分析堆栈跟踪可能无法告诉您OOME的实际原因(仅上次分配失败)。你能用例如?哇,这真的很有帮助。我一定要试试这个。谢谢