`

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这确实非常必要啊。
分享到:
评论

相关推荐

    JDK-1.7-Windows-32位 官方

    2. **try-with-resources语句**:这是一种新的异常处理机制,允许开发者在一个try语句块中声明资源,当try块结束时,这些资源会自动关闭,减少了资源泄露的风险。 3. **钻石操作符**:在创建匿名内部类或泛型实例时...

    【2018最新最详细】并发多线程教程

    18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题 19.并发容器之BlockingQueue 20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 21.线程池ThreadPoolExecutor实现原理 22.线程池之...

    一线大厂Java多线程面试120题.pdf

    9. **HashMap数据结构**:在JDK1.7中,HashMap使用数组+链表实现,而在JDK1.8中引入了红黑树,使得查找、插入和删除操作的平均时间复杂度降低。 10. **HashMap扩容**:当哈希表负载因子(元素数量/容量)达到阈值时...

    Java基础+Android面试题

    16. Android内存管理:分析了Android中的内存泄漏和内存优化策略。 17. Android进阶:涉及多线程、断点续传、全局异常处理等高级概念。 18. Android性能优化总结:探讨了如何优化Android应用的性能,包括布局、...

    java socket线程池

    在使用线程池时,还需要注意资源的释放问题,例如,在EchoServer类中,应当在适当的时候关闭ServerSocket和ExecutorService,避免资源泄露。关闭线程池时,通常使用shutdown()方法,它可以平滑地关闭线程池,不再...

    java面试题2024资源下载

    - **进程**:操作系统中的最小运行单位,每个进程都有独立的内存空间。 - **线程**:进程内的执行序列,是调度和执行的基本单位。 - **资源占用**: - 进程间相互独立,拥有各自的地址空间;线程共享同一进程的...

Global site tag (gtag.js) - Google Analytics