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