• 近期将进行后台系统升级,如有访问不畅,请稍后再试!
  • 极客文库-知识库上线!
  • 极客文库小编@勤劳的小蚂蚁,为您推荐每日资讯,欢迎关注!
  • 每日更新优质编程文章!
  • 更多功能模块开发中。。。

什么是内存泄漏

Java 最显著的优势之一就是它的内存管理机制。你只需简单创建对象,然后 Java 垃圾回收机制便会小心的分配和释放内存。然而,事实并非如此简单,因为在 Java 应用程序中经常发生内存泄漏。

本教程说明了什么是内存泄漏,为什么会发生,以及如何防止它们。

1.什么是内存泄漏?
内存泄漏的定义: 对象不再被应用程序使用,但是垃圾回收器却不能移除它们,因为它们正在被引用。

要理解这个定义,我们需要理解对象在内存中的状态,下图说明了哪些是未被使用的以及哪些是未被引用的。

从图中可以看到被引用的对象和未被引用的对象。未被引用的对象将会被垃圾回收器回收,而被引用对象则不会被回收。未被引用的对象理所当然是未被使用的,因为没有其他的对象引用它。然而,未被使用的对象并不一定是未被引用的,其中一些是被引用的。这就是内存泄漏的起因。

2.为什么会发生内存泄漏?
让我们来看看下面这个例子,看看为什么内存泄漏会发生。在如下例子中,对象 A 引用了对象 B。A 的生命周期(t1—t4)要比 B 的生命周期(t2—t3)长很多。当 B 不再用于应用中时,A 仍然持有对它的引用。在这种方式下,垃圾回收器就不能将 B 从内存中移除。这将可能导致出现内存不足的问题,因为如果 A 对更多的对象做同样的事情,那么内存中将会有很多无法被回收的对象,这将极度耗费内存空间。

也有可能 B 持有大量对其他对象的引用,这些被 B 引用的对象也不能够被回收。所有这些未被使用的对象将会耗费宝贵的内存空间。

3.如何阻止内存泄漏?
以下是一些阻止内存泄漏的快速动手技巧。
  • 注意集合类,例如 HashMap,ArrayList,等等。因为它们是内存泄漏经常发生的地方。当它们被声明为静态时,它们的生命周期就同应用程序的生命周期一般长。
  • 注意事件监听器和回调,如果一个监听器已经注册,但是当这个类不再被使用时却未被注销,就会发生内存泄漏。
  • “如果一个类管理它自己的内存,程序员应该对内存泄漏保持警惕。”[1] 很多时候当一个对象的成员变量指向其他对象时,不再使用时需要被置为 null。

4.一个小测验:为什么在 JDK6 中 substring()方法会引起内存泄漏?
为了回答这个问题,您可能需要阅读第二栏发的 JDK6 和 7 中的 substring()。

丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:什么是内存泄漏
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

欢迎 注册账号 登录 发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00