【问题标题】:Logging java outofmemoryerror stacktrace console output记录 java outofmemoryerror stacktrace 控制台输出
【发布时间】:2015-09-21 23:38:52
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 你在什么平台上?
  • @WhiteViking 我正在使用 linux :)
  • @MickMnemonic 感谢您的回答。我忘了提,但 HeapDump 也不是我的选择。 :)
  • 仅分析堆栈跟踪可能无法告诉您 OOME 的实际原因(仅最后一次失败的分配)。您可以使用例如配置您的应用程序吗? VisualVM?

标签: java logging out-of-memory


【解决方案1】:
  • 选项 1: 您可以使用 OnOutOfMemoryError 钩子与 jstack 结合来获取您的进程的堆栈跟踪:

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

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

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

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

【讨论】:

  • 哇,这真的很有帮助。我一定会试试这个。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
相关资源
最近更新 更多