昨天晚上跑的程序,今早来的时候发现抛了个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 内存设置是 Java 开发中非常重要的一部分。它直接影响着 Java 应用程序的性能和稳定性。jdk 内存设置主要包括堆大小设置、垃圾收集器的选择和配置等几个方面。 堆大小设置是 jdk 内存设置的核心内容。堆大小的...
这个参数在JDK 7及更早版本中使用,在JDK 8中已被移除,因为方法区不再被称为永久代,而是称为元空间(Metaspace),并使用本机内存而不是堆内存。 4. **-XX:MaxNewSize=256m**:设置年轻代(Young Generation)的...
在Java编程中,内存泄漏是一个严重的问题,它会导致程序性能下降,甚至可能导致应用程序崩溃。内存泄漏是指程序在申请内存后,无法释放已不再使用的内存空间,随着时间推移,系统可用内存逐渐减少,从而影响系统运行...
Java内存泄漏是一个严重的问题,它会导致程序性能下降,甚至可能导致应用程序崩溃。为了有效地诊断和解决这类问题,开发者需要借助特定的分析工具。本篇将详细探讨Java内存泄漏及其相关的分析工具。 内存泄漏是指...
标题与描述中的关键词“Sun_JDK_1.6内存管理--实现篇”指向了Java虚拟机(JVM)中Sun JDK 1.6版本的内存管理机制及其具体实现细节。在这一部分,我们将会深入探讨Sun JDK 1.6如何处理内存分配、垃圾收集以及其他优化...
标题中的“jdk1.6集成jjwt的问题”指的是在Java Development Kit (JDK) 版本1.6的环境下,尝试整合JSON Web Token (JWT) 库jjwt时遇到的挑战。JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 ...
"方便已义中文方式浏览jdk中的说明"强调了这个文档是中文翻译版,使得开发者能够更轻松地理解JDK中的各种类、接口、方法和概念,降低了学习和使用的难度。 **标签解析:** "范文/模板/素材" 这个标签可能是指这个...
JDK中文手册(JAVA),JDK API手册
《Sun JDK 1.6内存管理--调优篇》深入探讨了Java开发中的关键环节——JVM内存管理和性能优化。Sun JDK 1.6作为早期的Java开发环境,其内存管理机制对于理解现代JVM的工作原理至关重要。本文将详细解析JVM内存结构,...
在Java开发过程中,经常会遇到内存泄漏的问题,尤其是在长时间运行的应用程序中更为常见。本文将详细介绍如何解决Java内存泄漏问题,帮助开发者更好地理解和应对这一挑战。 #### 二、Java内存模型与内存区域 Java...
在实际运行过程中,由于各种原因,WebLogic可能会出现内存不足(Out of Memory)的问题,或者遇到内存泄漏(Memory Leak)的情况,这会严重影响应用的稳定性和性能。针对这些问题,我们需要进行WebLogic的内存调优。...
JDK文档会涵盖JVM的工作原理,包括类加载机制、垃圾收集(GC)以及内存区域(如堆、栈、方法区)的管理。 **5. 异常处理** Java的异常处理机制是通过try-catch-finally块来实现的。文档会详细解释如何抛出、捕获和...
MAT(Memory Analyzer Tool)是IBM开发的一款强大的Java内存分析工具,尤其在排查和...总的来说,MAT MemoryAnalyzer是Java开发者处理内存问题的强大武器,通过熟练运用这个工具,可以有效地提高应用的稳定性和性能。
IBM MAT(Memory Analyzer Tool)是IBM提供的一款强大的Java内存分析工具,主要用于诊断和解决Java应用程序中的内存泄漏问题。...熟练掌握MAT的使用方法,将极大地提升开发者处理复杂内存问题的能力。
文档给出了一个循环创建Vector对象并添加新对象的示例代码,并展示了如何通过清空Vector中的对象引用,将其置为null来解决内存泄漏的问题。 此外,文档提到了Java虚拟机(JVM)的垃圾回收器(GC)机制。GC的主要...
1. **Lambda表达式**:JDK 8最大的亮点之一就是引入了Lambda表达式,它使得函数式编程风格在Java中成为可能。Lambda允许将匿名函数作为参数传递,简化了多线程编程和事件处理,尤其是对集合操作的处理,如Stream API...
在Java的并发编程中,JDK提供的容器类库扮演了重要角色,其中`java.util.concurrent`包下的`BlockingQueue`接口及其实现类是多线程环境下数据同步的重要工具。本篇文章将深入探讨`LinkedBlockingQueue`,这是一个...
在"压缩包子文件的文件名称列表"中,我们看到两个文件名——`jdk-6u45-windows-i586.exe`是32位版本的JDK1.6,而`jdk-6u45-windows-x64.exe`则是64位版本的JDK1.6。用户应根据自身的需求和系统配置选择合适的版本...
下载后直接去本机jdk目录里替换jdk中的src.zip 再打开idea就能看到中文版的源码注释 示例 https://blog.csdn.net/a7459/article/details/106495622