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的条目。其想法是添加一组响应速度足够快的消费者,以确保队列永远不会被填满。如果它真的填满了,制作人将封锁直到空间被释放。队列就是这样工作的。