最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java内存泄漏原理及如何防止
时间:2015-04-16 编辑:简简单单 来源:一聚教程网
Java是一门可跨平台的面向对象的优秀编程语言,它的优势就是它的内存管理机制。只要创建对象,Java的垃圾回收器帮你分配以及回收内存。然而,实际内存泄漏在Java应用程序中经常发生。
下面就解释下什么是内存泄漏,它为什么会发生,以及我们如何阻止它的发生。
1. 什么是内存泄漏?
内存泄漏的定义:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着。
要想理解这个定义,我们需要先了解一下对象在内存中的状态。下面的这张图就解释了什么是无用对象以及什么是未被引用对象。
上面图中可以看出,里面有被引用对象和未被引用对象。未被引用对象会被垃圾回收器回收,而被引用的对象却不会。未被引用的对象当然是不再被使用的对象,因为没有对象再引用它。然而无用对象却不全是未被引用对象。其中还有被引用的。就是这种情况导致了内存泄漏。
2. 为什么会发生内存泄漏?
来先看看下面的例子,为什么会发生内存泄漏。下面这个例子中,A对象引用B对象,A对象的生命周期(t1-t4)比B对象的生命周期(t2-t3)长的多。当B对象没有被应用程序使用之后,A对象仍然在引用着B对象。这样,垃圾回收器就没办法将B对象从内存中移除,从而导致内存问题,因为如果A引用更多这样的对象,那将有更多的未被引用对象存在,并消耗内存空间。
B对象也可能会持有许多其他的对象,那这些对象同样也不会被垃圾回收器回收。所有这些没在使用的对象将持续的消耗之前分配的内存空间。
3. 如何防止内存泄漏的发生?
下面是几条容易上手的建议,来帮助你防止内存泄漏的发生。
特别注意一些像HashMap、ArrayList的集合对象,它们经常会引发内存泄漏。当它们被声明为static时,它们的生命周期就会和应用程序一样长。
特别注意事件监听和回调函数。当一个监听器在使用的时候被注册,但不再使用之后却未被反注册。
“如果一个类自己管理内存,那开发人员就得小心内存泄漏问题了。” 通常一些成员变量引用其他对象,初始化的时候需要置空。
-
上一个: 推荐5个很好用的Java分布式缓存框架
-
下一个: java环境变量设置步骤介绍
相关文章
- 东芝2TB XG5-P NVMe SSD上市时间介绍 12-01
- 千元全面屏LG Q6降临 骁龙430/3G内存 07-11
- 诺基亚3将于7月12日登陆英国 联发科MT6737+2GB内存 07-05
- 联想Moto X4渲染图曝光 骁龙625+4GB内存 07-05
- 网易MuMu模拟器内存清理方法 06-29
- 诺基亚9预计售价4766元 标配6GB内存 06-20