3.9K Star 22.5K Fork 7.8K

GVPdromara / hutool

 / 详情

上传大文件时内存溢出及解决方法

已完成
创建于  
2021-10-03 10:13

版本情况

JDK版本: jdk1.8.0_66(win7)
hutool版本: hutool-all-5.7.13(请确保最新尝试是否还有问题)

问题描述(包括截图)

  1. 复现代码
//文件大小3GB
HashMap<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("file", new File(bigfile));
String result1 = HttpUtil.post(serverUrl, paramMap);
  1. 堆栈信息
    java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3236)
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
    at sun.net.www.http.PosterOutputStream.write(PosterOutputStream.java:78)
    at cn.hutool.core.io.copy.StreamCopier.doCopy(StreamCopier.java:102)
    at cn.hutool.core.io.copy.StreamCopier.copy(StreamCopier.java:68)
    at cn.hutool.core.io.IoUtil.copy(IoUtil.java:161)
    at cn.hutool.core.io.IoUtil.copy(IoUtil.java:145)
    at cn.hutool.core.io.IoUtil.copy(IoUtil.java:131)
    at cn.hutool.core.io.IoUtil.copy(IoUtil.java:118)
    at cn.hutool.core.io.resource.Resource.writeTo(Resource.java:65)
    at cn.hutool.http.body.MultipartBody.appendPart(MultipartBody.java:125)
    at cn.hutool.http.body.MultipartBody.writeForm(MultipartBody.java:94)
    at cn.hutool.http.body.MultipartBody.write(MultipartBody.java:80)
    at cn.hutool.http.HttpRequest.sendMultipart(HttpRequest.java:1209)
    at cn.hutool.http.HttpRequest.send(HttpRequest.java:1153)
    at cn.hutool.http.HttpRequest.execute(HttpRequest.java:955)
    at cn.hutool.http.HttpRequest.execute(HttpRequest.java:926)
    at cn.hutool.http.HttpUtil.post(HttpUtil.java:192)
    at cn.hutool.http.HttpUtil.post(HttpUtil.java:179)
    at cn.xxxxxx.backupclient.service.impl.FileClientServiceImpl.synFileToServer(FileClientServiceImpl.java:105)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205)
    at com.sun.proxy.$Proxy61.synFileToServer(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

  2. 测试涉及到的文件(注意脱密)

    4.解决方法
    src\main\java\cn\hutool\http\HttpConnection.java 这个类的如下方法:
    /**

    • 初始化连接相关信息

    • @HTTP4O4 HttpConnection

    • @since_2013 4.4.1
      */
      public HttpConnection initConn() {
      try {
      this.conn = openHttp();
      } catch (IOException e) {
      throw new HttpException(e);
      }

      // 默认读取响应内容
      this.conn.setDoInput(true);
      //下面这一行修复bug
      //这个方法表示不使用PosterOutputStream而使用HttpURLConnection$StreamingOutputStream
      //缓存防止OutOfMemory。
      this.conn.setChunkedStreamingMode(0);
      return this;
      }

评论 (5)

coder1949 创建了任务
coder1949 关联仓库设置为dromara/hutool
coder1949 修改了描述
coder1949 修改了标题
展开全部操作日志

可以:

//文件大小3GB
HashMap<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("file", new File(bigfile));

HttpRequest.post(url).setChunkedStreamingMode(0).form(paramMap).execute().body();

5.4.7版本,加 setChunkedStreamingMode(0) 上传近100M的pdf,直接java.lang.OutOfMemoryError: Java heap space

Looly 任务状态待办的 修改为已完成
Looly 添加了
 
question
标签

谢谢,学习了。

问题描述不够清楚,导致我以为 setChunkedStreamingMode(0) 就是使用分块模块,实际是0就是表示使用PosterOutputStream输出流,会把文件全部缓存到内存后发送,需要设置对应分块大小,例如setChunkedStreamingMode(4096)才会使用StreamingOutputStream输出流
输入图片说明

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(5)
1463 loolly admin 1578914022 8271416 coder1949 1677297920 402390 dongshanghua 1578922783
Java
1
https://gitee.com/dromara/hutool.git
git@gitee.com:dromara/hutool.git
dromara
hutool
hutool

搜索帮助