【发布时间】:2017-12-21 19:33:59
【问题描述】:
我们在 Swing 应用程序或大量计算中使用繁重的多线程。有时可能会发生应用程序针对 OOME 运行并且无法再创建任何本机线程的情况。我完全理解应用程序必须意识到这一点,然后它的设计很糟糕,但它不能 100% 避免。问题在于,在这种情况下,JVM 绝对会丢失,因为它无法处理错误并且系统的行为不可预测。通常我们会记录每个内存错误并通过 -XX:OnOutOfMemoryError="kill -9 %p" 重新启动应用程序,但是由于显而易见的原因,这不起作用。另一方面,JVM 不再控制它有点令人沮丧。那么解决此类问题的好方法是什么?
PS:我不寻找像扩展系统进程限制或通过 Xss 减少线程堆栈大小这样的解决方案。我正在寻找一种如何处理的方法。
【问题讨论】:
-
提示:小心适应变通方法。当您的设计/代码被破坏并包含错误时,那么花在无助于修复该错误的事情上的每一分钟都是有风险的投资。
-
@GhostCat 感谢您的提示,但有时环境是问题所在。例如,我们在较新的 Linux 线程限制较低(systemd 的默认值)中遇到了问题。所以我们有漂亮的代码,根本就没有在其他环境中运行。
标签: java multithreading out-of-memory