gpt4 book ai didi

java - 是否保证会抛出Java OutOfMemoryError

转载 作者:行者123 更新时间:2023-12-02 10:48:36 27 4
gpt4 key购买 nike

我有一个 Java Spring Boot 应用程序。它是一个非常大的应用程序,具有许多服务,并且可以执行大量任务。我尝试实现的新任务之一是从 Oracle DB 读取一些数据并通过 REST 将其发送到某个外部应用程序。

正在读取的数据相当大(很难说有多大,它包含几何对象),大约有180万条记录需要读取。

为了处理这个问题,我使用“键集分页”作为从数据库读取的方式。这意味着我获取了最后一次读取的 id,然后根据该 id 获取下一页(e_id > lastReadId)。页面大小为 100 个实体。

在上次运行中,它达到了页面“6672”(已读取 667200 个实体并将其发送到外部应用程序)。值得注意的是,我不存储对这些对象的任何引用,只需获取页面,将其存储为列表并通过休息发送。在下次运行时,该列表将被新页面覆盖,依此类推。

这是每 3 小时获取的实体数量的图表,最多 1030 个实体,最少 145 个实体。

Fetched entities per 3h

我的问题是应用程序崩溃而没有任何错误。在日志中,我可以看到已获取最后一页(在本例中为“6672”,有时是其他页面),然后突然在我的应用程序启动时记录了一条日志消息。

我的第一个想法是它内存不足并且崩溃了。但没有任何迹象表明这一点。是否保证会在此时抛出 OutOfMemoryError ?我应该看别的东西吗?也许我做错了什么。

编辑

我正在添加一些代码供您查看我如何执行这些操作

// Get first page, last read id is null
List<MyEntity> data = dataService.collectData(pageSize, null);

sendDataToExternalService(data);
while(true) {
final String lastReadID = data.get(data.size() - 1).getId();
data = dataService.collectData(pageSize, lastReadID);
sendDataToExternalService(data);
}

方法sendDataToExternalService看起来像这样

restTemplate.exchange("some/url/to-external-app", HttpMethod.PUT, new HttpEntity<>(data), List.class);

RestTemplate 是org.springframework.web.client.RestTemplate

最佳答案

您可以将 JVM 配置为在收到此错误时生成堆转储。

要配置 JVM 以生成堆转储,请将 -XX:+HeapDumpOnOutOfMemoryError 选项添加到 Java 选项并重新启动 JVM。当发生堆空间错误时,JVM 将创建一个大小为配置的最大堆大小的文件。

查看详情 https://docs.bmc.com/docs/AtriumOrchestratorPlatform/77/troubleshooting-java-virtual-machine-memory-errors-329147248.html

关于java - 是否保证会抛出Java OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52361277/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com