首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java GC如何处理从超出可用堆内存的大型Stream加载的已处理对象?

Java GC如何处理从超出可用堆内存的大型Stream加载的已处理对象?
EN

Stack Overflow用户
提问于 2021-02-18 12:46:44
回答 3查看 131关注 0票数 0

假设我有一个从数据库加载的对象流(使用Spring Data JPA,如下所示)

代码语言:javascript
复制
public interface MyJpaRepository extends JpaRepository {

  Stream findAll();
}

假设有数百万个Foo对象存储在我的数据库中,使用的GB比我的最大堆内存大小大得多。

我期望通过如下方式使用流,当从数据库加载更多的对象时,JVM可以通过垃圾收集处理过的对象来正确地处理它的堆内存:

代码语言:javascript
复制
try (Stream fooStream =
    myJpaRepository.findAll()) {
  fooStream.forEach(entity -> logger.info("Hello !"));
}

但实际上,这段代码会抛出内存不足异常。

  • 在这种情况下,垃圾收集器是如何工作的?
  • 使用forEach消费这个流需要JVM将流中的数据完全加载到内存中(根据我的理解)?

谢谢你

EN

Stack Overflow用户

发布于 2021-02-18 12:54:21

在您的场景中,垃圾收集器将不会获得时间来采取行动并清理您的内存。让我试着解释更多细节。在启动java进程时,您配置了堆内存和垃圾收集算法。如果您没有对它们中的任何一个进行微调,JVM就会认为默认设置是理所当然的,然后继续执行。一旦您的进程开始分配堆,JVM就会在内部收集统计信息并调度垃圾收集过程。但是,如果您的进程没有提供足够的空间来决定何时以及如何收集垃圾,JVM将抛出内存溢出(OOM)错误并崩溃,正如您所观察到的那样。

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66253791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档