【发布时间】:2020-07-03 11:19:29
【问题描述】:
问题
为什么 Spring 的 RestTemplate 在发送文件时会使用过多的堆(尤其是G1 Old Generation)。
上下文
我们观察到RestTemplate 在通过POST 请求发送文件时会消耗过多的内存。我们使用 Spring 的 WebClient 作为比较,它的行为完全正常。
我们创建了一个包含完整代码的demo project on github。重要的部分是以下sn-ps:
private void sendFileAsOctetStream(File file) {
final RequestEntity<FileSystemResource> request = RequestEntity.post(URI.create("http://localhost:8080/file"))
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(new FileSystemResource(file));
restTemplate.exchange(request, void.class);
}
和
private void sendFileAsOctetStream(File file) {
webClient.post()
.uri("/file")
.body(BodyInserters.fromResource(new FileSystemResource(file)))
.exchange()
.block();
}
我们观察了jconsole 的内存使用情况,当发送具有两种实现的 550MB 文件时(左侧是 WebClient,右侧是 RestTemplate。WebClient 占用几兆字节,而 RestTemplate 需要 2.7技嘉:
- 用于清理老年代的初始手动 GC
- 请求
- 手动 GC(仅适用于
RestTemplate)
【问题讨论】:
标签: java spring spring-mvc resttemplate