如果java.lang.OutOfMemoryError即将发生

时间:2016-12-17 20:15:18

标签: java jvm out-of-memory

我正在测试一个游戏解算器,该解决方案跟踪Map<Long, Integer> solvedPositionsLong positionID Integerjava.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是否接近内存限制?

2 个答案:

答案 0 :(得分:2)

您可以查看MemoryMXBean,了解它是否可以为您提供所需内容,因为它代表:

Java虚拟机内存系统的管理界面。

您可以在here上找到更多内容。

答案 1 :(得分:2)

  

我可以检查地图尺寸是否超过特定值作为修剪的触发器,   但有没有一种本机方法来检查JVM是否接近内存限制?

您可以使用Java代理来检测程序 以下是官方文档:documentationhttps://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html关于SO的内容。

如果你在OpenJDK下,你可以使用jol工具: question

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