记录 java outofmemoryerror 堆栈跟踪控制台输出

Dan*_*Kim 5 java logging out-of-memory

我在 JAVA 程序中遇到了 OutOfMemoryError。发生 OutOfMemoryError 没关系,但我想在发生时记录它。我已使用 -XX:OnOutOfMemoryError 选项来检测它是否发生,但它不会记录打印到控制台的堆栈跟踪信息。我尝试使用重定向来记录此控制台输出,但是 2>&1、2> 和所有其他选项都无法记录此输出,并且它只是打印到控制台。有什么方法可以记录这个堆栈跟踪信息吗?我一直在 stackoverflow.com 上进行谷歌搜索,但找不到答案。请指教。

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

谢谢你!

Pet*_*iuk 6

  • 选项 1:您可以将OnOutOfMemoryErrorhook 与 jstack 结合使用来获取进程的堆栈跟踪:

    "-XX:OnOutOfMemoryError=jstack -l %p"

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

  • 选项 2:您可以使用setUncaughtExceptionHandler捕获所有异常并OutOfMemoryError专门检查:

    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
    
            @Override
            public void uncaughtException(Thread thread, Throwable ex) {
    ...
    
    Run Code Online (Sandbox Code Playgroud)