Soul柒月
2016-04-23 03:48
采纳率: 20%
浏览 3.8k

javaweb上传文件到本机时,文件一直占用在内存中导致OutOfMemoryError,求前辈指点

下面是上传代码和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内存视图
上传后的JvisualVM内存视图
上传后的JvisualVM内存视图
上传后的jconsole内存视图
上传后的jconsole内存视图
上传后的jconsole--old gen内存视图
上传后的jconsole--old gen内存视图
手动执行JvisualVM-GC清理后的内存视图
手动执行JvisualVM-GC清理后的内存视图

大概情况就是这样子了.文件上传本地后,内存一直被占用无法释放,导致内存溢出.困扰我很久了.希望有前辈能指点一下.谢谢!

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • On_the_orad 2016-04-23 04:04

    是内存溢出吧 你把虚拟内存值设大一点

    评论
    解决 无用
    打赏 举报
  • 风马博客 2016-04-23 07:31

    文件读写完成后要及时关闭输入输出流,如果是未关闭输入输出流就会出现该文件正在被其他应用程序占用的现象。可是为什么一会

    又可以打开文件了呢,是JAVA自动垃圾回收机制的问题,长时间不用该文件的输入输出流会默认回收掉。上传的文件时同名文件,所以是覆盖的。

    在写文件过程中,LED程序已经将其更新状态为1,但是此时输入输出流未关闭,导致LED程序无法访问上传文件。呵呵,到此应该知道怎么解决了。

    解决代码:

    public void upload() throws Exception{
    //以服务器的文件保存地址和源文件名建立上传文件输出流
    xczl.setPath(getSavePath()+"\"+getUploadFileName());
    FileOutputStream fos = new FileOutputStream(getSavePath()+"\"+getUploadFileName());
    //以上传文件创建一个文件上传流
    FileInputStream fis = new FileInputStream(upload);
    //将上传文件的内容写入服务器
    byte[] buffer = new byte[1024*1024];
    int len = 0;
    while((len = fis.read(buffer))>0)
    {
    fos.write(buffer,0,len);
    }
    fos.close();
    fis.close();//关键代码
    }

    如果不行可以看下你的jvm内存设置的大小,建议设大点:
    配置缓存步骤:点击 run 进入RunConfigurations 进入arguments 进入VM 在代码最下面添加如下代码:

    -Xms512m -Xmx2048m -XX:MaxPermSize=1024m

    Apply

    评论
    解决 无用
    打赏 举报
  • 525546523 2016-04-23 17:28

    试试把fos.flush();去掉

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题