为什么 RestTemplate 会消耗过多的内存?问题上下文
2022-09-04 03:54:14
问题
为什么Spring的RestTemplate在发送文件时使用过多的堆(特别是)。G1 Old Generation
上下文
我们观察到 RestTemplate 在通过请求发送文件时会消耗过多的内存。我们使用Spring的WebClient作为比较,它的行为完全理智。POST
我们在github上创建了一个包含完整代码的演示项目。重要部分是以下代码段:
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();
}
我们观察了在发送具有两种实现的550MB文件时的内存使用情况(左边是,右边是。它包含几个兆字节,而需要 2.7 千兆字节:jconsole
WebClient
RestTemplate
WebClient
RestTemplate
- 用于清洁旧一代产品的初始手动GC
- 请求
- 手动 GC(仅适用于
RestTemplate
)