Spring 数据 JPA 垃圾回收

Spring Data JPA garbage collection

我有一个带有 JpaPagingItemReaderSpring Batch 应用程序(我对其进行了一些修改)和 4 个 Jpa 存储库以丰富来自 JpaPagingItemReader 的 Model

我的流程是:

  1. SelectModel(页面大小=8192),然后我收集这个List<Model> to Map<String, List<Model>>(按id分组,因为型号不唯一我需要通过 id 来丰富它)然后用 4 个自定义 JpaRepositories 和带有 IN 子句的本地查询来丰富它,并将它们与 Java 8 Streams.
  2. 合并
  3. 将数据转换为 XML 对象并使用 Stax 将 MultiFileItemWriter 写入文件,每个文件拆分不超过 20000 .

一切正常,但今天我尝试 运行 处理来自数据库的大量数据。我生成了 20 个文件 (2.2 GB)。但有时我得到 OutOfMemory Java Heap(我有 1Gb XMS、XSS),然后我将它增加到 2GB 并且一切正常,但在 Instana 中我看到,Old gen Java memory 总是 900 GC后使用。使用中约为 1.3-1.7Gb。所以我开始思考,如何优化 Spring Data Jpa 对象的 GC。我认为他们在记忆中有很多时间。 当我使用 JpaPagingItemReader 建立 select 模型时,我会分离每个模型(使用 entityManager.detach),但是当我使用自定义 Spring Data Jpa 请求丰富 Model 时,我不会分离结果。也许这是问题所在,我应该将它们分离?

我不需要向数据库中插入数据,我只需要读取它。或者我是否需要缩小页面大小并且每个请求 select 大约 4000

我需要处理 370 000 条来自数据库的记录并丰富它们。

已解决。在我的 运行 配置中添加了标志,并将 XMS 和 XMX 增加了两次。