我正在测试一个游戏解算器,该解决方案跟踪Map<Long, Integer> solvedPositions
中Long
positionID
Integer
和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);
}
}
}
。增加内存大小是不切实际的,因为足够大的电路板将具有比给定计算机上的内存更多的位置。
我想这样做:
{{1}}
我可以检查Map大小是否超过某个值作为trim的触发器,但有没有一种本机方法来检查JVM是否接近内存限制?
答案 0 :(得分:2)
答案 1 :(得分:2)
我可以检查地图尺寸是否超过特定值作为修剪的触发器, 但有没有一种本机方法来检查JVM是否接近内存限制?
您可以使用Java代理来检测程序
以下是官方文档:documentation和https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html关于SO的内容。
如果你在OpenJDK下,你可以使用jol工具: question
这个想法是你确定地图应该到达的八位字节大小,以触发地图上的修剪操作。
然后在您的应用程序中,当您的地图到达一定数量的元素时,您可以执行地图八位字节大小的计算,以检查是否达到阈值,因此是否应该修剪它。