JDK中LinkedBlockingQueue 内存泄漏问题

本文描述了一个关于Java中LinkedBlockingQueue内存泄露的问题,该问题在JDK5/6中普遍存在,泄露点出现在poll方法中,泄露的对象为AbstractQueuedSynchronizer.Node。作者通过回滚到之前的同步FIFO实现解决了这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天晚上跑的程序,今早来的时候发现抛了个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这确实非常必要啊。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值