gpt4 book ai didi

java - 使用 Integer.MAX_VALUE 条目创建 ArrayBlockingQueue 时出现 OutOfmemory 错误

转载 作者:行者123 更新时间:2023-11-29 07:58:46 25 4
gpt4 key购买 nike

我一直在使用 LinkedBlockingQueue,由于插入性能较慢,最近将其更改为 ArrayBlockingQueue。之后,我的性能有了显着提高。但是,我的代码有时会抛出内存不足错误:

我的 Java 代码

ArrayBlockingQueue<String> s = new ArrayBlockingQueue<String>(Integer.MAX_VALUE);

我查看了ArrayBlockingQueue 源代码。真的,我很震惊——它为给定的初始容量分配一个 object[]。这就是内存不足错误的原因。

ArrayBlockingQueue源码

public ArrayBlockingQueue(int capacity, boolean fair) {
if (capacity <= 0)
throw new IllegalArgumentException();
this.items = (E[]) new Object[capacity];
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}

这不会猜测初始容量或创建具有最小容量的队列。因为它会在高峰时间和正常时间有所不同。如果我给出最小容量,队列将在高峰时段立即填满。如果我给出最大容量,我会得到一个内存不足的错误,我不想在插入元素之前分配一个对象[]。

请提出任何替代方案。

最佳答案

删除构造函数的参数。为什么您的队列需要那么大的容量?从一个合理的数字开始,例如 10、100 或 1000。

这一行很荒谬:

ArrayBlockingQueue<String> s = new ArrayBlockingQueue<String>(Integer.MAX_VALUE);

您不需要 2147483647 的初始容量。2GB 仅用于队列!

关于java - 使用 Integer.MAX_VALUE 条目创建 ArrayBlockingQueue 时出现 OutOfmemory 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15848624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com