Java 使用Integer.MAX\u值项创建ArrayBlockingQueue时发生OutOfmemory错误
我一直在使用Java 使用Integer.MAX\u值项创建ArrayBlockingQueue时发生OutOfmemory错误,java,performance,memory-management,collections,capacity,Java,Performance,Memory Management,Collections,Capacity,我一直在使用LinkedBlockingQueue,最近由于插入性能缓慢,将其更改为ArrayBlockingQueue。在那之后,我的表现有了显著的提高。但是,我的代码有时会抛出内存不足错误: 我的Java代码 ArrayBlockingQueue<String> s = new ArrayBlockingQueue<String>(Integer.MAX_VALUE); public ArrayBlockingQueue(int capacity, boolean
LinkedBlockingQueue
,最近由于插入性能缓慢,将其更改为ArrayBlockingQueue
。在那之后,我的表现有了显著的提高。但是,我的代码有时会抛出内存不足错误:
我的Java代码
ArrayBlockingQueue<String> s = new ArrayBlockingQueue<String>(Integer.MAX_VALUE);
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);
ArrayBlockingQueue s=新的ArrayBlockingQueue(Integer.MAX_值);
您不需要初始容量为2147483647。仅排队就需要2GB 用更多内存启动java<代码>-Xmx 32G或其他任何类型。另外,您还要如何创建一个通用的ArrayBlockingQueue?它是一个固定容量。队列将很快被填满。不会有2GB的条目。其想法是添加一组响应速度足够快的消费者,以确保队列永远不会被填满。如果它真的填满了,制作人将封锁直到空间被释放。队列就是这样工作的。