gpt4 book ai didi

java - 如果 java.lang.OutOfMemoryError 即将发生,请执行

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:33 25 4
gpt4 key购买 nike

我正在测试一个游戏解算器,它跟踪 Map<Long, Integer> solvedPositions 中已解决的位置其中 LongpositionIDInteger拥有达到此位置的最小已知层数。求解器处理较小的电路板,但会导致 java.lang.OutOfMemoryError: GC overhead limit exceeded在更大的板上。增加内存大小是不切实际的,因为足够大的电路板的位置会超过给定计算机内存中的位置。

我想这样做:

...
boolean isTimeToTrimRecords = willResizedMapExceedMemLimit();
if(isTimeToTrimRecords){
int maxDepthOfRecordedPlies = getMaxDepth();
removeLastPly(solvedPositions, maxDepthOfRecordedPlies);
setMaxDepthOfRecordedPlies(maxDepthOfRecordedPlies-1);
}

...
public void removeLastPly(Map<Long, Integer> solvedPositions, int maxDepthOfRecordedPlies){

for (Map.Entry<Long, Integer> position : solvedPositions.entrySet()) {
Long positionID = position.getKey();
Integer value = position.getValue();
if(value==maxDepthOfRecordedPlies){
solvedPositions.remove(positionID);
}

}
}

我可以检查 Map 大小是否超过特定值作为 trim 的触发器,但是是否有本地方法来检查 JVM 是否接近内存限制?

最佳答案

I can check if Map size exceeds certain value as a trigger for trim, but is there a native way to check if JVM is close to memory limit?

您可以使用 Java 代理来检测您的程序。
这是官方文档:https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html和一个 question关于SO。

如果您使用的是 OpenJDK,则可以使用 jol 工具: http://openjdk.java.net/projects/code-tools/jol/

这个想法是您确定您的 map 应该达到哪个八位字节大小以触发 map 上的修剪操作。
然后在您的应用程序中,当您的 map 达到一定数量的元素时,您可以计算 map 的八位字节大小以检查是否达到阈值以及是否应修剪它。

关于java - 如果 java.lang.OutOfMemoryError 即将发生,请执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41202636/

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