【问题标题】:Servlet File UploadingServlet 文件上传
【发布时间】:2013-06-27 13:21:00
【问题描述】:

我正在使用 servlet 进行多文件上传(使用 Apache Commons FileUpload)。我的部分代码发布在下面。我的问题是,如果我一次又一次地上传文件,应用服务器的内存消耗会急剧增加。 Apache Tomcat 服务器似乎挂在内存上并且永远不会返回它。堆空间内存不足。有时它会耗尽内存异常并抛出java heap space error

我关闭了所有输入流,我认为问题出在ServletFileUpload,谁能帮我解决如何关闭它。

ServletContext context=this.getServletConfig().getServletContext();
DiskFileItemFactory factory = new DiskFileItemFactory();
FileCleaningTracker fileCleaningTracker = FileCleanerCleanup.getFileCleaningTracker(context);
factory.setFileCleaningTracker(fileCleaningTracker);

if (isMultiPart) {
    upload = new ServletFileUpload(factory);

    try {
        itr = upload.getItemIterator(request);
        while (itr.hasNext()) {

        item = itr.next();
        if (item.isFormField()) {
        ...

【问题讨论】:

  • 用 VisualVM 连接到 JVM,看看是什么占用了内存,我敢打赌它不会是 comons-upload 的东西。

标签: java web-applications servlets heap-memory apache-commons-fileupload


【解决方案1】:

您正在使用 FileCleaningTracker,Apache commons FileUpload 的某些版本在该组件中存在错误(请参阅:http://blog.novoj.net/2012/09/19/commons-file-upload-contains-a-severe-memory-leak/

好像已经修复了:https://issues.apache.org/jira/browse/FILEUPLOAD-189

所以尝试使用最后一个可用的版本。

【讨论】:

  • 谢谢...你能描述一下 DiskFileItemFactory 的使用,以及当我创建一个没有它的 ServletFile Upload 对象时会发生什么
  • @user2535809 这在Apache commons FileUpload documentation 中有更好的解释,请查看用户指南、流式 API 和 javadoc。
猜你喜欢
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2011-07-17
  • 2014-07-30
相关资源
最近更新 更多