responseentity是否将所有内容都存储在内存中?

bq3bfh9z  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(392)

这似乎是个简单的问题,但我找不到答案。
在spring boot中,我有一个返回json的控制器方法:

@GetMapping
public ResponseEntity<Stream<MyObject>> get() {
  return ResponseEntity
    .ok()
    .contentType(MEDIA_JSON)
    .body(service.stream());
}

这是正确地流到用户(成片)还是整个流在返回到用户之前加载到内存中?

mm5n2pyu

mm5n2pyu1#

我没有在文档中找到任何东西,但是可以尝试查看它的行为。
让我们创建两个端点和一个无限的对象流:

@RestController
public class MyController {

    @GetMapping("/stream")
    public ResponseEntity<Stream<MyObject>> stream() {
        return ResponseEntity.ok(getStream());
    }

    @GetMapping("/nostream")
    public ResponseEntity<List<MyObject>> noStream() {
        return ResponseEntity.ok(getStream().collect(Collectors.toList()));
    }

    private Stream<MyObject> getStream() {
        return IntStream.iterate(0, i -> i + 1)
                .mapToObj(i -> new MyObject());
    }

    static class MyObject {

        private String name = "foo";

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

打电话http://localhost:8080/流将立即响应,生成一个无限的 [{"name":"foo"},{"name":"foo"}... 如果您分析应用程序,您可以看到它可以持续几分钟而不增加内存使用量:

相反,打电话给http://localhost:8080/nostream端点将快速导致 java.lang.OutOfMemoryError :

相关问题