请先了解下背景,是这样子的:我们系统用到了jspsmart.jar来上传文件,近期系统经常挂死,导致页面打不开,后分析出为jspsmart组件有内存泄漏,其实也就是这个包本身有问题,在m_binArray = new byte[m_totalBytes] ,把所有上传的字节一下子都装到内存中了。。我的解决方案:参考之前网上其它兄弟的修改经验,1.将jspsmart.jar 中 SmartUpload.java中upload方法做了一些判断。
m_totalBytes = m_request.getContentLength();
//我加的部分(try 和if判断),目的是使最大内存只能达到50MB的字节,太多会泄漏。
try
{
if(m_totalBytes>52428800 || m_totalBytes<0)
{
throw new SmartUploadException("the file is too large to upload.");
}
else
{
//结束,另外在catch后抛出异常
m_binArray = new byte[m_totalBytes];2.在jspsmart.jar 中 SmartUpload.java 添加如下方法来释放: public void stop()
{
try
{
m_binArray=null;
}
catch(Exception e)
{
System.out.println(e.toString());
}
}3.在调用smartupload组件的upload方法的系统JAVA类中捕获上面异常,并在使用完成后如下进行调用 stop方法来释放
mySmartUpload.stop();
mySmartUpload = null;
修改完成之后替换类文件和 jspsmart.jar后系统运行了一段时间还是挂了还是jspsmart组件内存泄漏我不知道还有哪里修改的不对?如果哪位兄弟碰到此问题的请指正下,谢谢!!!
PS:
在之前代码中上传的Servlet中对文件大小都做了如下判断,限制为100K
if (fileSize > Double.parseDouble(maxFileSize))
{
//转向
request.getRequestDispatcher(page).forward(request, response);
}
m_totalBytes = m_request.getContentLength();
//我加的部分(try 和if判断),目的是使最大内存只能达到50MB的字节,太多会泄漏。
try
{
if(m_totalBytes>52428800 || m_totalBytes<0)
{
throw new SmartUploadException("the file is too large to upload.");
}
else
{
//结束,另外在catch后抛出异常
m_binArray = new byte[m_totalBytes];2.在jspsmart.jar 中 SmartUpload.java 添加如下方法来释放: public void stop()
{
try
{
m_binArray=null;
}
catch(Exception e)
{
System.out.println(e.toString());
}
}3.在调用smartupload组件的upload方法的系统JAVA类中捕获上面异常,并在使用完成后如下进行调用 stop方法来释放
mySmartUpload.stop();
mySmartUpload = null;
修改完成之后替换类文件和 jspsmart.jar后系统运行了一段时间还是挂了还是jspsmart组件内存泄漏我不知道还有哪里修改的不对?如果哪位兄弟碰到此问题的请指正下,谢谢!!!
PS:
在之前代码中上传的Servlet中对文件大小都做了如下判断,限制为100K
if (fileSize > Double.parseDouble(maxFileSize))
{
//转向
request.getRequestDispatcher(page).forward(request, response);
}
,使用apache 的commons-fileupload,这个网上有很多例子。