`

JDK中LinkedBlockingQueue 内存泄漏问题

阅读更多
昨天晚上跑的程序,今早来的时候发现抛了个Java Heap: OutOfMemory的异常,于是觉得很奇怪。因为其实程序很简单,没有任何的输入而且线程都是Blocking住的,怎么会OutOfMemory呢?是开了JConsole看JVM的内存使用情况,过了一段时间,一条向上倾斜的直线很明显说明有内存泄露。为了确定泄露点,再开Profiling,发现Leak发生在LinkedBlockingQueue.poll(long timeout, TimeUnit unit)方法中,Leak的对象是AbstractQueuedSynchronizer.Node。仔细检查了一下自己的Code,一个很普通的应用:BlockingQueue用作两进程间通信,不会有问题的。百思不得其解时,Google了一把LinkedBlockingQueue Memory Leak,发现还有一些人碰到了和我一样的问题,原来这是JDK5/6中都存在的一个Bug:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=2143840 。据称JDK5会在Update12里Fix,JDK6会在Update2里Fix。一查,两个Update都还没Release呢,看来指望用Sun的Fix目前是不可能了。于是又Backport回自己以前的Synchorized Fifo实现,再做测试,果然不泄漏了。
 
LinkedBlockingQueue的应用广泛,个人感觉这个Bug影响比较大,而且像ArrayBlocingQueue等对象都有相同的问题。因此记录下来希望对查找解决相关问题的同仁们有些帮助。
 
这个问题是在程序跑了很长时间的情况下才发现的,通宵跑Test这确实非常必要啊。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics