我们在Swing应用程序或大量计算中使用重型多线程。应用程序有时会针对OOME运行,并且无法再创建任何本机线程。我完全理解应用程序必须意识到这一点,然后设计很糟糕,但它无法100%避免。问题是在这种情况下,JVM绝对丢失,因为它无法处理错误并且系统的行为不可预测。通常我们记录每个内存错误并通过-XX重新启动应用程序:OnOutOfMemoryError =“kill -9%p”,但是这显然不起作用。另一方面,JVM无法控制有点令人沮丧。那么解决这类问题可能是一个好方法呢?
PS:我不会通过Xss搜索扩展系统进程限制或减少线程堆栈大小的解决方案。我正在寻找一种如何处理的方法。
答案 0 :(得分:2)
JVM可以完美地控制OutOfMemoryErrors并优雅地处理它,你的程序优雅地处理它。您可以像处理其他每个错误一样捕获并处理OutOfMemoryError,只是大多数程序都不会这样做。
要解决您的问题,您应首先尝试查明这些内存错误的根源,例如通过记录它们,或使用性能/内存分析工具。在这些情况下,enforcing a core-dump也很有用,然后可以让您在发生这种情况时分析根本原因。
最后,重新设计应用程序将有必要通过限制使用的内存量来避免OOM错误。这可以通过测试程序可以正常处理多少个线程然后强制执行该限制,或者在创建新线程之前检查可用内存来完成。架构更改可能会有所帮助,但您没有发布有关内部的详细信息,因此我无法在此提供任何建议。