昨天晚上跑的程序,今早来的时候发现抛了个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内存设置 jdk内存设置 jdk内存设置 jdk内存设置 jdk内存设置 jdk内存设置
增加JDK配置内存,高效快捷!
JDK1.8中文文档 JDK1.8中文 jkd8中文文档 JDK中文版 标准的API规范文档,谷歌中文翻译 全翻译
JDK中文手册(JAVA),JDK API手册
JDK容器学习之Queue:LinkedBlockingQueue
Sun_JDK_1.6内存管理--实现篇-毕玄
下载后直接去本机jdk目录里替换jdk中的src.zip 再打开idea就能看到中文版的源码注释 示例 https://blog.csdn.net/a7459/article/details/106495622
Sun JDK 1.6内存管理--调优篇
jdk8中文说明文档_CHM.zip jdk1.8文档 jdk1.8说明文档 官方直接翻译
jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助...
JDK 1.8中文API文档
jdk中文文档,积分便宜你的不二选择, jdk中文文档,积分便宜你的不二选择, jdk中文文档,积分便宜你的不二选择
jdk8中文手册
JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11...
jdk8中文API文档
JAVA设计模式在JDK中的应用JAVA设计模式在JDK中的应用 各种设计模式在JDK当中使用的地方 方便分析源码
介绍JDK内存管理,可以了解JAVA的内存布局,编写更安全的java程序
java api jdk 中文 java api jdk 中文
JDK6.0 中文文档JDK6.0 中文文档JDK6.0 中文文档JDK6.0 中文文档JDK6.0 中文文档JDK6.0 中文文档JDK6.0 中文文档
jdk1.6集成jjwt的问题