有三种可能导致OutOfMemoryError。首先是,此JVM有真实的内存泄漏,导致此JVM堆在内部实现时产生了一个Bug。这极不可靠。所有 JVM都经过充分的测试,并且,如果有人发现这种bug,它将绝对是最高的优先级。因此你可以非常宽心地排除这种可能性。
第二种可能的 OutOfMemoryError原因只不过是,你没有为你的应用程序运行时给予足够多的可用内存。这种情况,有两种可能的方案,或者增加JVM堆可用大小,或者减少你的应用程序所需的内存总量。提高JVM可用堆大小可以简单的使用JVM的 -Xmx 参数。假如你将此参数设置尽可能的大(可用内存极限不要超过系统物理内存,否则你的应用程序将分页并暂停),仍然有以上所提到的内存问题,那么,你需要减少你的应用程序所可能用到内存总量。减少应用程序内存可能是简单的,你可能允许一些集合过大,例如使用了许多大的缓冲区。或者它过于复杂,要求你重新实现一些类,乃至重新设计应用程序。
读者 Jams Stauffer 指出有些JVM(例如 sun的 JVMs),还有一个“Perm”参数用来处理JVM结构与类对象。如果你正在使用一个数量非常巨大的类集,它有可能运行在"Perm"空间之外,然后你需要增加此空间的大小,例如,sun的JVM使用 -XX:PermSize 与 -XX:MaxPermSize 选项。
第三种导致OutOfMemoryError最为常见,无心的对象引用保持。你没有明确无误的释放对象,以致于你的堆增长再增长,直到你没有额外的空间。
处理OutOfMemoryError:
是JVM内部的BUG?不太可能。如果是,这是优先级最高的BUG(为什么还没有人发现它,而你碰到了?)。
没有足够的内存分配给实际运行的应用程序?两种选择:使用-Xmx参数增加堆的最大使用内存(或者使用-XX:MaxPermSize参数增加Perm空间大小); 或者使用更小的集合/缓冲区/表空间/对象.....,以减少所需要的内存总量,也就是说,可以调整对象大小,重新设计与重新实现你的应用程序。
无心的对象引用保持?找到保持这些无意引用的源对象,改变它并释放这些对象。在IBM开发者社区的文章纲要式的揭示了这样一个通用的处理过程。这个过程主要是等到应用程序到达恒定状态--你将期望最多的新创建的对象是临时对象,并且可以被垃圾收集器收集。这常常是在应用程序所有的初始化工作完成之后。
强迫垃圾收集,获得一个堆的对象快照。
做任何工作可能正在导到无意的对象引用保持。
强迫另一次垃圾收集并获得第二次堆的对象快照。
比较这两个快照,观察从第一个快照到第二个快照哪些对象在数量上有所增加。因为你在快照之前强迫垃圾收集,剩下的将是所有被应用程序引用的对象,比较两个快照将准确的标识那些新创建的、保留在应用程序里的对象。
根据你对应用程序的认识,决定两个快照比较中,哪些对象正在无意的保持对象引用。
跟踪前导引用,找到哪些对象正在引用这些无意的保持对象,直到你找到导致此问题的源对象。
地址:http://blog.csdn.net/shenghuafen/archive/2005/07/26/435393.aspx
分享到:
相关推荐
- 当不再需要这些资源时,应及时释放,避免内存泄漏。 - 使用诸如`try-with-resources`语句来自动关闭资源。 **3.2 异常处理** - 在处理异常时,应当优先使用`try-catch-finally`结构。 - `finally`块用于执行必要...
理解GC的工作原理和性能优化策略,能有效防止内存泄漏。 11. **Java虚拟机(JVM)**:理解JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区等)以及JVM调优,有助于提升程序性能。 12. **Java 8及以后的...
内存泄漏可能是由Web请求中的特定对象导致的,即使少量的泄漏可能暂时不会造成严重后果,但大量泄漏(如10000或20000个)将显著减少堆中的可用内存,尤其是当这些对象涉及复杂的数据结构时,比如Person对象与Profile...
8. **jmap**:用于生成堆转储文件(heap dump),帮助分析内存泄漏。例如,`jmap -dump:format=b,file=heap.hprof <pid>`。 9. **jhat**:Java Heap Analysis Tool,分析由`jmap`生成的堆转储文件,找出内存问题。 ...
9. **最佳实践**:学习良好的编程习惯,如使用PreparedStatement防止SQL注入,释放数据库连接,避免内存泄漏等。 这个实战项目对于初学者来说是一个很好的练习,可以帮助他们更好地理解和掌握Web开发的基本流程,...
4. **内存管理**:JNA负责内存管理,避免了JNI中的内存泄漏问题。 **JNI详解** 相比之下,JNI是Java平台标准的一部分,提供了与本地代码交互的底层接口。虽然它提供了更灵活的控制,但学习曲线较陡峭,因为开发者...
:检测应用内存泄漏问题,这个都知道吧 :帮助Android控件和回调的进行依赖注入,JakeWharton大神的力作 :Android和Java依赖注入库 :一个实现异步操作的库,现在非常火 :用于Android的Rxjava绑定库 :配合Rxjava...