在spring boot中使用restTemplate上传大文件Java heap space

最近项目中有个2G大的文件需要上传,报错如下:

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 org.springframework.util.StreamUtils.copy(StreamUtils.java:128)
    at org.springframework.http.converter.ResourceHttpMessageConverter.writeContent(ResourceHttpMessageConverter.java:115)
    at org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:107)
    at org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:50)
    at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:227)
    at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:849)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:617)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:580)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:498)

这一看就是内存溢出问题,可能最先想到的解决方案就是在启动的时候增加jvm内存,但是这样只能解决一时的问题,因为我们并不知道后面我们会遇到多少G的文件。

通过在google搜索resttemplate Java heap space最终在spring官网找到了这个问题的解决方法Sending large payloads with RestTemplate results in an OutOfMemoryError,原来已经有人在之前踩过坑了。

总结下来就是在创建RestTemplate的时候配置下面参数

SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
RestTemplate rest = new RestTemplate(requestFactory);

该代码的意思是请求工厂类是否应用缓冲请求正文内部,默认值为true,当post或者put大文件的时候会造成内存溢出情况,设置为false将数据直接流入底层HttpURLConnection。

找到了原因,将代码加入程序,测试,正常上传。

在搜索Sending large payloads with RestTemplate results in an OutOfMemoryError问题的时候还看到了
- Download Large file from server using REST template Java Spring MVC
- Download Large file from server using REST template Java Spring MVC

在下载时候也会遇到的打文件问题,没有仔细看,留个记录。

扫描下方Q群二维码快速加入Java学习交流群
Java学习交流Q群

你可能感兴趣的:(spring,生产问题,rest,template,大文件)