【发布时间】:2013-03-28 17:39:50
【问题描述】:
我一直在使用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();
}
这不会猜测初始容量或创建具有最小容量的队列。因为高峰时间和正常时间会有所不同。如果我提供最小容量,队列将在高峰时段立即填满。如果我给出最大容量,则会出现内存不足错误,并且我不想在插入元素之前分配 object[]。
请提出任何替代方案。
【问题讨论】:
-
只是用更多内存启动java?
-Xmx 32G或其他。另外,您还打算如何创建一个通用的 ArrayBlockingQueue?
标签: java performance memory-management collections capacity