OutOfMemory
假设有一个大型 Java 应用程序,如果发生错误,我想优雅地关闭它。现在我看到以下问题:
- 一些组件捕获并“吞下”所有组件,
Throwables
包括OutOfMemory
- 如果一个线程没有捕获
OutOfMemory
它就退出并且我们不知道OutOfMemory
发生了什么
我可以以某种方式注册一个“JVM 级”处理程序来捕获任何OutOfMemory
可能发生在 JVM 中的 JVM 吗?
OutOfMemory
假设有一个大型 Java 应用程序,如果发生错误,我想优雅地关闭它。现在我看到以下问题:
Throwables
包括OutOfMemory
OutOfMemory
它就退出并且我们不知道OutOfMemory
发生了什么我可以以某种方式注册一个“JVM 级”处理程序来捕获任何OutOfMemory
可能发生在 JVM 中的 JVM 吗?
一些组件捕获并“吞下”所有 Throwable,包括 OutOfMemory
他们不应该那样做,我会修复他们。
如果一个线程没有捕获 OutOfMemory,它就会退出并且我们不知道 OutOfMemory 发生了
我也会解决的。
您可以注册一个 UncaughtExceptionHandler。
唯一的选择可能是在 OOME 上触发一个脚本,该脚本会关闭您的程序。这可以从命令行完成。
内存不足问题是错误,这意味着您无法从中恢复正确的 JVM 状态,因此您无法进行任何终结。相反,您可以尝试监视您的应用程序内存消耗,并在可用内存级别太低时尝试正确关闭它(我想这就是您想要的)。
永远不要发现错误!所以,RTFM!;)
错误非常奇怪,所以它们应该抛出到 main 并停止 VM。
异常是可抛出的,可以“处理”(SocketTimeoutException、NullpointerException 等)。错误是无法处理的可抛出对象(在最常见的情况下)。如果抛出 OutOfMemoryError,你想做什么?你能延长你的记忆@执行时间吗?垃圾收集器通常会在抛出 OOME 之前运行多次。
所以在你的特殊情况下:很高兴,你有足够的内存来创建 OutOufMemoryError-Object 来看看 VM-Death 的原因是什么。
重构你的代码!;)