【发布时间】:2014-02-15 13:42:56
【问题描述】:
我正在开发基于 Java 6/Tomcat 6.0 的 Java Web 应用程序。这是一个基于网络的文档管理系统。客户可以将任何类型的文件上传到该 Web 应用程序。上传文件后,会生成一个新线程,在其中分析上传的文件。分析是使用第三方库完成的。
这个第三方库在大约 90% 的分析作业中运行良好,但有时(取决于上传的文件)逻辑开始使用所有剩余内存,导致 OutOfMemoryError。
由于整个应用程序在单个 JVM 中运行,OoM-Error 不仅会影响分析作业,还会影响其他功能。在最坏的情况下,应用程序完全崩溃或保持不一致的状态。
我现在正在寻找一种相当快速(但安全)的方法来处理这些 OoM 错误。目前更换库是没有选择的(这就是为什么我没有提到库的名称,也没有提到做过什么样的分析)。有没有人知道可以做些什么来解决这个错误?
我一直在考虑启动一个新进程 (java.lang.ProcessBuilder) 来拥有一个新的 JVM。如果第三方库在那里导致 OoM-Error,它不会对 Web 应用程序产生影响。另一方面,这将导致将新流程与 Web 应用程序的分析部分同步的额外工作。有人对这样的系统有任何经验吗(尤其是在系统稳定性方面)?
更多信息: 1)分析部分可以概括为一种文本提取。该模块接收文件引用作为输入并将分析结果写入文本文件。生成的文本文件在 Web 应用程序业务逻辑中进一步处理。目前工作流是同步的。业务逻辑等待第三方库完成其工作。没有排队或其他异步方法。
2) 我很确定第三方库会导致 OoM 错误。我已经用不同大小的不同文件单独测试了分析部分。导致 OoM-Error 的文件非常小(大约 4MB)。我已经对该特定文件进行了进一步的测试。在拥有 256MB 堆的 JVM 时,分析由于 OoM 错误而崩溃。在具有 512MB 堆的 JVM 中通过相同的测试。但是,增加堆大小只会在短时间内有所帮助,因为更大的测试文件会再次导致测试由于 OoM-Error 而失败。
3) 上传文件的大小有限制;但当然每个文件不能有 4MB 的限制。操作系统和架构也是如此。系统必须同时在 32 位和 64 位系统(Windows 和 Linux)上工作
【问题讨论】:
标签: java jvm out-of-memory heap-memory processbuilder