性能问答>求助寻找容器内oom的原因>
3回复
6月前

求助寻找容器内oom的原因



 Micronaut 应用程序中运行着批处理,它从数据库中获取 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

因为在容器重启后没有得到任何 heapdump 文件所以假设不是 Micronaut 应用程序导致容器进入 OOM。

容器内存限制为 512m。

有排查调试的建议不?

 

253 阅读
请先登录,查看3条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步