jvm:是否有可能在关闭钩子中发现由于OOM导致进程正在关闭?

Per*_*ium 5 java memory jvm out-of-memory shutdown-hook

我有一个在java(1.6)中运行的关键进程,带有一个注册的关闭钩子.在某些情况下我得到一个OOM问题(下面有关于该问题的更多细节),该过程突然停止,我没有得到任何我的日志,我的捕获(Throable x)没有捕获异常.

但是关闭钩子有效.因此,如果有一种方法可以知道由于某些令人讨厌的OOM而导致进程停止,我可以在退出之前记录必要的信息.

有没有办法做到这一点?

关于OOM:不确定什么是例外,因为我说它不会被抓住.我知道这是一个OOM因为我开始这个过程

-XX:+HeapDumpOnOutOfMemoryError
Run Code Online (Sandbox Code Playgroud)

我得到一个堆转储文件.在其他情况下,会捕获异常,并且它是ava.lang.OutOfMemoryError:超出了GC开销限制.但不确定这种情况总是如此.

编辑:

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

我的问题是:是否有可能在关机钩子中发现由于OOM导致进程正在关闭?

我需要以编程方式相同的过程进行此操作.

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

Pet*_*ego 3

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

尝试设置默认的未捕获异常处理程序。它将捕获所有未捕获的异常。