下面是上传代码和java内存监视图
以上传一个300M文件大小为示例
@RequestMapping("/uploads")
public @ResponseBody String upload(MultipartHttpServletRequest request,
HttpServletResponse response) throws Exception {
String result = "";
// 获取上传的所有文件名
Iterator<String> itr = request.getFileNames();
MultipartFile mpf = null;
while (itr.hasNext()) {
// 取出文件
mpf = request.getFile(itr.next());
try {
File file = new File(UPLOADFILEPATH);
if (!file.exists()) {
file.mkdirs();
}
// 输出(保存)文件
FileOutputStream fos = new FileOutputStream(new File(UPLOADFILEPATH + mpf.getOriginalFilename()));
//获取文件的输入流并写入文件
InputStream fis = mpf.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
fos.flush();
}
//关闭流
fis.close();
fos.close();
mpf = null;
result = "{\"success\":true}";
} catch (IOException e) {
result = "{\"success\":false}";
e.printStackTrace();
}
}
itr = null;
System.gc();
return result;
}
下面是内存监视图
上传前的JvisualVM内存视图
上传后的JvisualVM内存视图
上传后的jconsole内存视图
上传后的jconsole--old gen内存视图
手动执行JvisualVM-GC清理后的内存视图
大概情况就是这样子了.文件上传本地后,内存一直被占用无法释放,导致内存溢出.困扰我很久了.希望有前辈能指点一下.谢谢!