最近在JSP程序开发过程中,发现了很严重的Java内存溢出问题。我采用了Resin服务器自动重启的方法,临时保证了网站的正常运行。但是我想去寻找问题的症结之所在,我想一定是JSP程序或Java程序没有及时地释放内存,但到底是哪些类的哪些对象没有被释放?
我认真的看了一下Resin的错误日志(error.log文件),发现程序出现java.lang.OutOfMemoryError的错误大多情况是在运行一个上传附件的文件时发生的。在这个上传附件的JSP文件中,我调用了目前网上很流行的jspsmartupload组件,难道是这个组件本身有问题?
于是我就下载了一个Java反编译工具,把jspsmartupload组件的源码文件(class文件)反编译成Java文件。这个组件用到了五个自定义的类,分别是File类、Files类、Request类、SmartUpload类和SmartUploadException类。里面最核心的方法莫过于SmartUpload类的upload()方法。我看到upload方法中有这样两个语句:
m_totalBytes = m_request.getContentLength(); (*)
m_binArray = new byte[m_totalBytes]; (**)
其中,变量m_totalBytes表示用户上传的文件(二进制文件)的内容的总长度,我做了一个测试,一个55.3M
的文件,它的m_totalBytes是58012662
,显然这是一个很大的数。如果用这样大的数去声明一个byte数组,并给数组的每个元素分配内存空间,Java内存不溢出才怪呢!另外,我发现SmartUpload类中的m_binArray数组竟然从来没有被释放,难道真的不需要释放吗?JVM的功能有我们想象的那么强大吗?
我对SmartUpload类作了如下的改进:
(1)对upload()方法的(**)语句加上了totalBytes大小的限制,并加上了try...catch...finally去处理异常,如下:
try{
if(m_totalBytes>55184652 || m_totalBytes<0) //55184652相当于52.6M
{
throw new SmartUploadException("the file is too large to upload.");
}
else
{
m_binArray = new byte[m_totalBytes];
......
}
catch(Exception e){......}
catch(Error err){......}
finally{ m_binArray=null;}
这样,就能保证不管用户传的文件是多大,不会出现java.lang.OutOfMemoryError的错误,而且如果upload失败,m_binArray所占的内存空间也会被释放。
(2)在SmartUpload类中增加了一个stop()方法,该方法完成的工作就是释放m_binArray数组所占的内存空间。代码如下:
try{
m_binArray=null;
}
catch(Exception e)
{
System.out.println(e.toString());
}
jspsmartupload组件就做了这些修改,下面就需要更改调用该组件的JSP文件了。其实这个JSP文件有一些地方写得不规范。(以下代码中mySmartUpload表示SmartUpload的一个实例化对象)
(1)首先要设置上传附件的MaxSize。
mySmartUpload.setTotalMaxFileSize(10240000); //10240000表示10M
(2)调用SmartUpload.upload()方法要捕获一个异常。
try{
mySmartUpload.upload();
}
catch(Exception e)
{
out.print("文件太大,无法上传");
return;
}
(3)程序结束时要调用SmartUpload.stop()方法。
mySmartUpload.stop();
mySmartUpload=null;
好了,修改完了,把修改后的文件用Resin进行测试(操作系统仍然用Linux9.0),程序至今还没有出现java.lang.OutOfMemoryError的错误。
但愿这种方法能彻底帮我解决问题。当然,还需做进一步测试,看看修改后的组件会不会出现新问题。
分享到:
相关推荐
使用jspSmartUpload组件在jsp中实现上传和下载 在现代Web开发中,文件上传与下载是常见的需求之一,尤其在企业级应用、个人博客、图片分享等场景中尤为重要。jspSmartUpload作为一款专为JSP设计的文件上传组件,以...
采用jspSmartUpload 组件实现的上传下载的完整实例 下载即可运行,但是这个压缩包不支持中文名称的文件下载功能,我上传了一个可以下载中文的不会乱码的jspSmartUpload 组件,网址:...
**JSpsmartupload组件**是一个基于Java的上传文件解决方案,主要应用于JSP(Java Server Pages)环境中。这个组件提供了一种简单且强大的方式来处理用户通过网页上传的文件。在标题和描述中提到的,该组件的核心是用...
**JspSmartUpload组件详解及使用攻略** JspSmartUpload是一个功能强大的Java Web上传组件,专为处理用户在网页上提交的多文件上传而设计。它简化了在JSP(JavaServer Pages)环境中处理文件上传的过程,使得开发者...
原始的jspSmartupload组件不支持中文上传,所以我把这个源码进行修改后,现在可以支持中文上传了,你的工程也必须是在统一的utf-8的编码环境下,因为我做的修改,就是将中文用utf-8进行编码。 我只测试了上传功能,...
下面将详细介绍jspSmartUpload组件的安装与配置流程,以及其核心类的基本使用。 #### 二、安装与配置步骤 1. **下载与解压缩:** - 首先,从官方或其他可信来源下载`jspSmartUpload.zip`文件。 - 解压缩后,你会...
在提供的`JspSmartUpload.chm`文件中,通常包含了组件的详细文档,包括API参考、示例代码和常见问题解答等,这对于理解和使用JSP Smart Upload非常有帮助。通过查阅这个帮助文件,开发者可以更深入地了解如何利用该...
**jspSmartUpload组件详解** `jspSmartUpload`是一款在Java Web开发中广泛使用的文件上传与下载组件,尤其在基于JSP(JavaServer Pages)的应用中,它提供了方便、高效的文件处理功能。本篇文章将深入探讨该组件的...
`jspSmartUpload`组件是Java Web开发中用于实现文件上传和下载功能的一款强大工具,尤其在基于JSP的B/S(Browser/Server)架构应用程序中,它以其便捷性和高效性受到开发者们的青睐。本篇文章将深入探讨`jsp...
jspSmartUpload 组件 源代码,并对源代码进行了修改,使其在下载中文文件时,不会出现乱码。使用方法参见http://blog.sina.com.cn/s/blog_4cc16fc50100bwby.html
使用JspSmartUpload组件时,通常遵循以下步骤: 1. **引入库**:在JSP页面中,需要引入SmartUpload的相关jar文件。 2. **实例化SmartUpload对象**:在JSP或Servlet中创建SmartUpload对象。 3. **设置参数**:配置...
**jspSmartUpload组件详解** `jspSmartUpload`是一款在Java Web开发中广泛使用的开源文件上传组件,特别适合在JSP页面上实现文件上传和下载功能。这个组件以其强大的功能、简单易用的API以及良好的社区支持,深受...
`jspSmartUpload` 是一个在JSP(Java Server Pages)环境下广泛使用的上传下载组件,它基于Java技术,提供了强大的文件上传和下载功能。本文将深入探讨`jspSmartUpload`组件的工作原理、主要特性以及如何在实际项目...
注意:默认情况下,仅webapps/jspsmartupload目录下的应用可以直接使用jspSmartUpload组件,其他Web应用程序需要单独进行配置。 #### 三、组件核心功能 **File类**:该类提供了处理单个文件的主要方法,包括保存...
**jspSmartUpload组件详解** `jspSmartUpload`是一款在Java Web开发中广泛使用的上传组件,它为开发者提供了处理用户文件上传的功能。这个组件的核心在于它简化了文件上传的复杂过程,使得开发者能够方便地在JSP...
本文将深入探讨如何使用`jspSmartUpload`来实现这两个功能,并详细解释其工作原理和相关知识点。 首先,`jspSmartUpload`是一个基于Java Servlet的文件上传组件,它提供了一套完整的API来处理文件上传的过程。这个...
本文将深入探讨JSPSmartUpload组件的工作原理、使用方法及其核心优势。 JSPSmartUpload组件是基于Java Servlet和JSP技术的,它提供了一套完整的API,使得开发者能够方便地在JSP页面上添加文件上传和下载功能。这个...
`jspSmartUpload`组件是Java Web开发中广泛使用的文件上传工具,尤其在早期的Web应用中,它提供了方便的文件上传功能。这个组件允许用户在网页上选择一个或多个文件,然后通过HTTP POST请求将这些文件上传到服务器。...