更换网站需要备案吗,wordpress网站推翻重建,青海省住房建设厅网站,wordpress本地卡转载自 介绍Java中的内存泄漏Java语言的一个关键的优势就是它的内存管理机制。你只管创建对象#xff0c;Java的垃圾回收器帮你分配以及回收内存。然而#xff0c;实际的情况并没有那么简单#xff0c;因为内存泄漏在Java应用程序中还是时有发生的。
下面就解释下什么是内存…转载自 介绍Java中的内存泄漏Java语言的一个关键的优势就是它的内存管理机制。你只管创建对象Java的垃圾回收器帮你分配以及回收内存。然而实际的情况并没有那么简单因为内存泄漏在Java应用程序中还是时有发生的。
下面就解释下什么是内存泄漏它为什么会发生以及我们如何阻止它的发生。
1. 什么是内存泄漏
内存泄漏的定义对象已经没有被应用程序使用但是垃圾回收器没办法移除它们因为还在被引用着。
要想理解这个定义我们需要先了解一下对象在内存中的状态。下面的这张图就解释了什么是无用对象以及什么是未被引用对象。上面图中可以看出里面有被引用对象和未被引用对象。未被引用对象会被垃圾回收器回收而被引用的对象却不会。未被引用的对象当然是不再被使用的对象因为没有对象再引用它。然而无用对象却不全是未被引用对象。其中还有被引用的。就是这种情况导致了内存泄漏。
2. 为什么会发生内存泄漏
来先看看下面的例子为什么会发生内存泄漏。下面这个例子中A对象引用B对象A对象的生命周期t1-t4比B对象的生命周期t2-t3长的多。当B对象没有被应用程序使用之后A对象仍然在引用着B对象。这样垃圾回收器就没办法将B对象从内存中移除从而导致内存问题因为如果A引用更多这样的对象那将有更多的未被引用对象存在并消耗内存空间。
B对象也可能会持有许多其他的对象那这些对象同样也不会被垃圾回收器回收。所有这些没在使用的对象将持续的消耗之前分配的内存空间。3. 如何防止内存泄漏的发生
下面是几条容易上手的建议来帮助你防止内存泄漏的发生。
特别注意一些像HashMap、ArrayList的集合对象它们经常会引发内存泄漏。当它们被声明为static时它们的生命周期就会和应用程序一样长。特别注意事件监听和回调函数。当一个监听器在使用的时候被注册但不再使用之后却未被反注册。“如果一个类自己管理内存那开发人员就得小心内存泄漏问题了。” 通常一些成员变量引用其他对象初始化的时候需要置空。
4. 一个小问题为什么JDK6中的substirng()方法容易导致内存泄漏
要想解答上面的问题你或许可以看看Substring() in JDK 6 and 7。