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

标签 java jvm out-of-memory

我正在测试一个游戏解算器,它跟踪 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/

相关文章:

java - 使用 go 管理 Java 进程

java - 调整直接缓冲内存的大小

java - Spark 应用java.lang.OutOfMemoryError : Direct buffer memory

r - projectRaster 消耗太多内存

JavaFX 和 Gradle

java - Java EE Web 应用程序中的无效字符串或缓冲区长度异常

JAVA_HOME 路径适用于 Java,但不适用于 Android Studio

在我的 linux 机器中找不到 javadoc

java - 如何使用注解对 Spring Controller 进行单元测试?

Java Diffie-Hellman key 交换