java - jvm:是否有可能在关闭 Hook 中发现进程由于 OOM 而关闭?

标签 java memory jvm out-of-memory shutdown-hook

我有一个在 java (1.6) 中运行的关键进程,带有一个已注册的关闭 Hook 。在某些情况下,我遇到了 OOM 问题(下面有更多关于该问题的详细信息),进程突然停止,我没有收到任何日志,我的 catch(Throable x) 没有捕获到异常。

但是关闭 Hook 有效。因此,如果有一种方法可以知道该进程将由于某些讨厌的 OOM 而关闭,我可以在退出前记录必要的信息。

有没有办法做到这一点?

关于 OOM: 不确定什么是异常,因为正如我所说,它不会被捕获。我知道这是一个 OOM,因为我用

开始这个过程
-XX:+HeapDumpOnOutOfMemoryError

然后我得到一个堆转储文件。在其他情况下会捕获异常,这是 ava.lang.OutOfMemoryError: GC overhead limit exceeded。但不确定是否总是这种情况。

编辑:

如果不清楚:我不会试图阻止 OOM,因为在某些情况下它可能出于正当理由发生,我只是想确保它在应用程序日志文件中是清楚的

我的问题是:是否有可能在关闭 Hook 中发现进程由于 OOM 而关闭?

我需要以编程方式从同一进程执行此操作。

目前最好的方法是查看它是否存在具有最近日期的 process_.hprof(我知道 pid)的堆转储文件 java_pid_pid 并推断存在 OOM。 我想我可以尝试 Runtime.getRuntime().freeMemory() 并在可用内存非常低时报告问题,但不确定这有多可靠,也许当进程关闭时它已经释放了很多内存,方法以上是我认为最好的。

最佳答案

OOM 很棘手,因为如果 JVM 内存不足,它可能会因为抛出新的 OOM 而无法运行异常处理代码。

尝试设置 default uncaught exception handler .它将捕获所有未捕获的异常。

关于java - jvm:是否有可能在关闭 Hook 中发现进程由于 OOM 而关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4145963/

相关文章:

java - 向后递归线性搜索

java - 使用 Maven 部署项目

java - Struts 2 中的验证和主题

Java:非堆内存分析

java - 如何自动找到包含jvm的目录来启动jar?

java - 如何测量java方法的内存使用情况

java - 如何在我的 Web 应用程序中使用 "bigbluebutton"?

C - 如何正确释放指向 n 字符数组 ((*p)[n]) 的指针的内存?

java - Mallet 文档分类 - 减少词汇量

c - 查找分配的内存