如何从运行OOM的JVM子进程中恢复?

时间:2018-06-28 12:45:49

标签: process jvm

我有两个JVM进程A和B。进程A与用户通信并使用B作为从服务器,以进行大量计算:User -> A -> B.compute

然而,对于某些输入,方法B.compute可能会用尽内存(无法知道哪个)。在这种情况下,我想通知用户,他给我的输入数据不合适,我想重新启动B。

我在Google上找到了以下(不是很详细)解决方案:

  • 捕获B catch (OutOfMemoryException e)中的错误
  • 使用JVM选项-XX:OnOutOfMemoryError=restart-command
  • 手动从A重新启动B

哪种方法最合适?

请显示一个最小的(与操作系统无关的)工作示例。

1 个答案:

答案 0 :(得分:1)

让JVM突然终止对于任何类型的应用程序来说都不是一个好的设计。

如果您知道在某些情况下会导致这种情况,我将设计进程B监视其自身的内存使用情况,然后在内存用完的情况下终止对数据的处理。

您可以简单地做到这一点:

Runtime rt = Runtime.getRuntime();
long usedMem = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;

您可以在可用内存上设置一个阈值,您的B进程将停止处理该输入,丢弃所有结果,并通知A这是错误的输入。垃圾收集器将回收未使用的内存,并让B准备好进行更多输入(如果确实需要,可以显式调用System.gc()强制执行此操作,但我不建议这样做)。