我正在编写一个程序,该程序应该将生成的数据不断推送到List sensorQueue中。副作用是我最终将耗尽内存。发生这种情况时,我想删除列表的一部分,在此示例中,是第一部分,或更旧的一半。我想如果遇到OutOfMemeryException,就不能只使用sensorQueue = sensorQueue.subList((sensorQueue.size() / 2), sensorQueue.size());,所以我来这里寻找答案。

我的代码:

public static void pushSensorData(String sensorData) {
    try {
        sensorQueue.add(parsePacket(sensorData));
    } catch (OutOfMemoryError e) {
        System.out.println("Backlog full");

        //TODO: Cut the sensorQueue in half to make room
    }
    System.out.println(sensorQueue.size());
}

最佳答案

有没有一种简单的方法可以检测即将发生的OutOfMemoryException?


您可以像下面这样确定MAX内存和USED内存。使用这些信息,您可以定义程序中的下一组动作。例如减小其大小或删除一些元素。

final int MEGABYTE = (1024*1024);
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
long maxMemory = heapUsage.getMax() / MEGABYTE;
long usedMemory = heapUsage.getUsed() / MEGABYTE;


希望这会有所帮助!

关于java - 遇到OutOfMemoryException时删除一部分List <>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59804517/

10-11 01:33