我有一个在 java (1.6) 中运行的关键进程,带有一个已注册的关闭挂钩。在某些情况下,我遇到了 OOM 问题(下面有关于该问题的更多详细信息),进程突然停止,我没有得到任何日志,我的 catch(Throable x) 没有捕获异常。
但是关闭挂钩有效。因此,如果有办法知道该进程将由于一些讨厌的 OOM 而关闭,我可以在退出之前记录必要的信息。
有没有办法做到这一点?
关于 OOM:不确定是什么异常,因为正如我所说,它没有被捕获。我知道这是一个 OOM,因为我开始这个过程
-XX:+HeapDumpOnOutOfMemoryError
我得到一个堆转储文件。在其他情况下,会捕获一个异常,这是一个 ava.lang.OutOfMemoryError: GC 开销限制超出。但不确定是否总是这样。
编辑:
如果不清楚:我不是试图阻止 OOM,因为在某些情况下它可能出于正当原因发生,我只是想确保在应用程序日志文件中清楚
我的问题是:是否有可能在关机钩子中找出由于 OOM 而关闭的进程?
我需要以编程方式并从同一进程执行此操作。
目前最好的方法是查看它是否存在最近日期的 process_.hprof(我知道 pid)的堆转储文件 java_pid_pid 并推断存在 OOM。我想我可以尝试 Runtime.getRuntime().freeMemory() 并在可用内存非常低时报告问题,但不确定这有多可靠,也许当进程关闭时它已经释放了很多内存,该方法以上是我认为最好的。