gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:41:58 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com