请先了解下背景,是这样子的:我们系统用到了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);
}

解决方案 »

  1.   

    不使用jsp smart,这个很久没维护了
    ,使用apache 的commons-fileupload,这个网上有很多例子。
      

  2.   

    什么年代了,还在用 jspsmart?这东西连网站都没了!现在好的上传组件除了 Apache Commons FileUpload 之外,还有一个是著名的计算机图书出版商 O'Reilly 发布的 COS。COS 也有好长时间没更新了,但至少官网还在,不过这种东西确实没啥好更新的。只有还是使用 HTTP/1.1 就没啥好改的。
      

  3.   

    谢谢火龙果,但是我是在维护一个老系统,现在出现内存泄漏问题了,比较纠集,按上面方法修改了还是不行,如果换包的知工作量会比较大,因为有几个类用到的,如果不换包能不能解决呢?为什么我在JAR包中已经把读入内存大小限制在50M了还是有问题?如果知道请指点下,谢谢
      

  4.   

    长痛不如短痛,果断换,我用的是spring的upload,包装了commons-fileupload,使用方便