gpt4 book ai didi

java - MySQL 和 Java - 内存问题

转载 作者:行者123 更新时间:2023-11-28 23:13:48 25 4
gpt4 key购买 nike

我有一个 mysql 数据库,其中填充了一个对象,该对象包含一个带有时间戳(长)的映射和一个对象(safeboxForLongString)。

保险箱中的字符串大小为 5-15MB。

我的问题是,在从服务器请求字符串数据约 30 分钟后,我的 RAM 内存已经达到 11-12 GB。我已经尝试调用 System.gc 并清除之前填充的 TreeMap。但没有成功。

我不必使用所有 RAM 的后备数据库的目的不是吗?

我无法完成收集服务器数据的过程,因为我总是在那个问题上失败。请帮助我。

这里是相关代码

   //fill the Database
Main.getAllAvailableEntries().forEach(entryName -> {

final long[] id = {0};
treeMapWrapperRepo.findAll().forEach(entry -> {
if (entry.getCurrency().equals(entryName)) {
id[0] = entry.getMultiHashMapWrapper_id();
}
});

if (id[0] == 0) {
System.out.println("Forming: " + entryName);
final TreeMapWrapper treeMapWrapper = new TreeMapWrapper(entryName);
TreeMap<Long, SafeBoxForLongString> timeStampToSafeBoxMap = new TreeMap<>();
int start = startDateInThePast;
while (start - length >= 0) {
long startDate = instant.minus(start, ChronoUnit.DAYS).getEpochSecond();
long endDate = instant.minus(start - length, ChronoUnit.DAYS).getEpochSecond();

String getReponseWith45DaysLength = dataController.getDataForDB(entryName, startDate, endDate, String.valueOf(resolution));
while (getReponseWith45DaysLength.isEmpty()) {
getReponseWith45DaysLength = dataController.getDataForDB(entryName, startDate, endDate, String.valueOf(resolution));
}

SafeBoxForLongString safeBoxForLongString = new SafeBoxForLongString(getReponseWith45DaysLength);
safeBoxForLongString.setMultiHashMapWrapper(treeMapWrapper);

timeStampToSafeBoxMap.put(startDate, safeBoxForLongString);
treeMapWrapper.setLongSafeTimeAndReponseMap(timeStampToSafeBoxMap);

start--;
}
treeMapWrapperRepo.save(treeMapWrapper);
treeMapWrapper.getLongSafeTimeAndReponseMap().clear();
System.gc();
}
});

编辑:正如一位堆垛机所说,treeMapWrapperRepo.findAll()。是问题所在。

最佳答案

我看到的错误很少。首先,您要从数据库中检索所有条目。这些条目将直接从磁盘 (DB) 加载到 RAM(Java 对象)。

然后,垃圾收集器开始查找未引用/分离的对象。知道了这一点,我会重构代码并在存储库端使用分页来一次加载 10 个项目或任何其他合适的值。不要在列表中存储所有检索到的对象,只存储您需要的对象。您可以通过将变量设置为 null 来提示 GC。

另外,我不确定这个 Main.getAllAvailableEntries() 从哪里获取数据。问题可能出在 treeMapWrapperRepo.findAll() 上。

正如 Dominik 在评论中建议的那样,尝试使用 Profiler 和 Debugger。这会提示您泄漏内存的位置。

关于java - MySQL 和 Java - 内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44799085/

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