【发布时间】:2021-10-02 07:54:56
【问题描述】:
我正在我的 Micronaut 应用程序中运行一个批处理,它从 db 获取 500 000 条记录,挑选 100 个项目的批处理,然后在处理(包括对该批处理的 api 调用)之后再次将数据插入另一个 sqlite 表中。
try (Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id,item_id,type,operation FROM table WHERE serial_id = ? AND type = ? AND fail_reason IS NULL" )) {
statement.setString(1, serialId);
statement.setString(2, type.name());
ResultSet resultSet = statement.executeQuery();
List<ItemEntity> itemEntities = new ArrayList<>(batchSize);
int i = 0;
while (resultSet.next()) {
itemEntities.add(ItemEntity.builder()
.id(resultSet.getString("id"))
.itemId(resultSet.getString("item_id"))
.type(ItemType.valueOf(resultSet.getString("type")))
.operation(Operation.valueOf(resultSet.getString("operation")))
.build());
i++;
if(i == batchSize) {
i = 0;
consumer.accept(itemEntities);
itemEntities.clear();
}
}
if(!itemEntities.isEmpty())
consumer.accept(itemEntities);
} catch (Exception ex) {
log.error("error", ex);
throw new RuntimeException("error", ex);
}
}
每当这个批处理运行时,容器就会以退出代码 137 重新启动。我已经检查了下面的 jvm 参数
-XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError -XX:HeapDumpPath=/var/data/heapdump.hprof
由于容器重启后我没有得到任何堆转储文件所以我假设不是 Micronaut 应用程序导致容器进入 OOM。
容器内存限制为 512m。
我可以尝试调试这个问题的所有方法是什么?
【问题讨论】:
-
是否有卷挂载到目标转储路径?
-
@tmarwen 是的,它已安装。这不是问题,因为当我为 java 应用程序分配较少的 Xmx 时,我能够生成堆转储。
标签: java sqlite containers out-of-memory micronaut