Selevt中内存清理

J2EE 码拜 10年前 (2015-07-18) 1837次浏览

在实际项目中需要向服务器上上传文件,但是tomcat将上传的文件解析为2进制数组后,tomcat内存增长很快。我做了测试发现当在servlet中穿件对象时,这个内存就会增加比如:
public class Query extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
StringBuffer buffer = new StringBuffer();
for(int i=0;i<1000000;i++){
buffer.append(“hello”);
}
buffer.replace(0, buffer.length()-1, “”);
System.gc();
}

}
当访问这个Servlet时tomcat内存会增大30M左右,这个怎么处理,求助,先谢谢啦

25分

#1

内存里真实有这么大的数组或者字符串,是少不了的。
文件操作可以用Buffer技术,限制每次读取的字节个数,来限制内存占用量。

#2

@oh_Maxy 这个导入文件的问题我已经解决利用的是commons-fileupload-1.3.1jar包。但是这个字符串不清理我不知道该怎么处理,不知道当用户多了内存就会消耗严重呢,这是jvm还是tomcat问题呢

#3

回复2楼:

如果真的存在这样超大的buffer,可以用buffer.setLength(0)来处理。如果是list或map,用clean操作一下。

#4

可以分批上传,批次处理,然后及时清理,避免内存占用峰值过大就行

#5

@oh_Maxy 好像也没什么效果啊,Selevt中内存清理;我是这么看内存的,不知道准不准,按你说的清理后这个内存变化和没清理时一样的

#6

@u010582851 我不知道这个该怎么清理,我想就是内存怎么能下去呢
5分

#7

你循环写入内存100万次,你说内存吃紧不?各什么系统都受不了,内存吃紧是正常现象,不过生产中没有这么干的。

#8

回复5楼:

那就想办法分段处理的数据吧!
比如原先100w一批处理的,降低到10w一批处理数据。

10分

#9

原因是循环一百万次,会导致大量数据进行旧生代,垃圾回收后内存会下来。建议不要这样使用

#10

@xuanming25 我不太懂“会导致大量数据进行旧生代”,你的意思是以后这个内存会会降下来吗

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Selevt中内存清理
喜欢 (0)
[1034331897@qq.com]
分享 (0)