我有两个JVM进程A和B。进程A与用户通信并使用B作为从服务器,以进行大量计算:User -> A -> B.compute
然而,对于某些输入,方法B.compute
可能会用尽内存(无法知道哪个)。在这种情况下,我想通知用户,他给我的输入数据不合适,我想重新启动B。
我在Google上找到了以下(不是很详细)解决方案:
catch (OutOfMemoryException e)
中的错误-XX:OnOutOfMemoryError=restart-command
哪种方法最合适?
请显示一个最小的(与操作系统无关的)工作示例。
答案 0 :(得分:1)
让JVM突然终止对于任何类型的应用程序来说都不是一个好的设计。
如果您知道在某些情况下会导致这种情况,我将设计进程B监视其自身的内存使用情况,然后在内存用完的情况下终止对数据的处理。
您可以简单地做到这一点:
Runtime rt = Runtime.getRuntime();
long usedMem = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
您可以在可用内存上设置一个阈值,您的B进程将停止处理该输入,丢弃所有结果,并通知A这是错误的输入。垃圾收集器将回收未使用的内存,并让B准备好进行更多输入(如果确实需要,可以显式调用System.gc()强制执行此操作,但我不建议这样做)。