java - 遇到 OutOfMemoryException 时删除 List<> 的一部分

标签 java

我正在编写一个程序,该程序应该不断地将生成的数据推送到列表传感器队列中。副作用是我最终会耗尽内存。当发生这种情况时,我想删除列表的一部分,在本例中是第一部分,或更旧的一半。我想象如果我遇到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());
}

最佳答案

Is there an easy way to detect an impending OutOfMemoryException then?

您可以使用如下所示的方法来确定最大内存和已使用内存。使用该信息,您可以在程序中定义下一组操作。例如减小其大小或删除一些元素。

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/

相关文章:

java - 将 EditText 存储在数组中并显示在 TextView 中

java - 在java中提取唯一的调用者信息

java - String.subString() 和 String.subSequence() 有什么区别

java - 为什么线程被称为轻量级进程?

java - 如何使用大值格式化程序设置自定义后缀

java - 来自 Android 的 Http 连接

java - Maven 无法获取依赖项

java - Java 方法中如何返回值?

JavaFX 绑定(bind)和属性更改

java - 无法找到 XML 模式命名空间 (JMS) 的 Spring 命名空间处理程序