ArrayBlockingQueue
和一个线程,使用 take()
等待从该队列中获取数据。在循环结束后,理论上队列和线程都可以被垃圾回收,但实际上很快就会出现 OutOfMemoryError
错误。是什么阻止了它们被GC,如何解决这个问题?/**
* Produces out of memory exception because the thread cannot be garbage
* collected.
*/
@Test
public void checkLeak() {
int count = 0;
while (true) {
// just a simple demo, not useful code.
final ArrayBlockingQueue<Integer> abq = new ArrayBlockingQueue<Integer>(2);
final Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
abq.take();
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
// perform a GC once in a while
if (++count % 1000 == 0) {
System.out.println("gc");
// this should remove all the previously created queues and threads
// but it does not
System.gc();
}
}
}
我正在使用Java 1.6.0。
更新:在几个迭代之后执行垃圾回收,但这并没有帮助解决问题。