我有一个在 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/