什么是内存泄漏

转载 2018年02月08日 13:36:49

推荐阅读

    微服务:springboot系列教程学习

    源码:Javaweb练手项目源码下载

    调优:十五篇好文回顾

    面试笔试:面试笔试整理系列


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()。



译者:范琦琦
原文:https://www.programcreek.com
译文:http://www.importnew.com/8715.html



译者:范琦琦
原文:https://www.programcreek.com
译文:http://www.importnew.com/8715.html

什么是内存溢出与内存泄露,几种常见导致内存泄露的写法

还是决定写点东西,也不能一直空着,写的可能不太好,希望大家能够尽量用包容的眼光去看待,更多的是欢迎有什么不对的地方,可以指正。         大多数时候,如果是做安卓的同学总是能听到内存泄露,或者...
  • yw876506943
  • yw876506943
  • 2015年12月21日 16:12
  • 3995

什么是内存泄漏?

内存泄漏就是指分配的内存或资源,在使用以后,没有释放掉。 一般出现内存泄漏的情况。以new分配内存以后,没有用delete释放内存居多...
  • qq_33160271
  • qq_33160271
  • 2017年03月02日 17:09
  • 173

什么是java内存泄漏?

转自:http://zhidao.baidu.com/link?url=z0-hAk2hk7pIRNEf5WLdvFzNvEtgInI4beXpoI4qxklTfPIFIhS4InGqPMYvKgQt...
  • suyu_yuan
  • suyu_yuan
  • 2016年08月04日 12:48
  • 203

什么是内存泄漏

原文链接:The Introduction of Memory Leaks Java最显著的优点之一就是内存管理。你可以轻易地创建对象,然后Java垃圾回收器就会管理内存的分配与释放。然而,情况并非...
  • Cynthia9023
  • Cynthia9023
  • 2013年12月25日 16:38
  • 566

什么是内存泄漏?

内存泄漏可以分为4类: 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。...
  • her0z
  • her0z
  • 2010年03月31日 07:30
  • 522

验证内存泄漏的简单方法

最近我们的openresty服务器出现了内存泄露现象,这个方法是运维在解决问题的时候传授给我们的。验证内存泄漏的简单方法:pmap -d 进程号 每隔一段时间pmap一下,看看上面这三个值有没有增加...
  • ljfrocky
  • ljfrocky
  • 2016年09月13日 18:31
  • 546

内存泄漏是个什么狗东西

内存泄漏是个什么狗东西(hdd) 为啥写这个东西? 最近继续三四天一直在跟踪大家反映很久很久很久的ONVIF协议服务器被NVR或ODM(ONVIF Device Manager)工具探测就会出内存...
  • ji1029
  • ji1029
  • 2014年12月09日 08:40
  • 1144

什么情况导致内存泄漏

1.资源对象没关闭造成的内存泄漏 描述: 资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。它们的缓冲不仅存在于 j...
  • qq_34378183
  • qq_34378183
  • 2016年10月11日 10:22
  • 1079

c/c++:内存泄露和野指针的概念

内存泄漏  用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,不能被任何程序再次使用,直到程序结束。即所谓内存泄漏。    注意:内存泄漏是指堆内存的泄漏。  简...
  • dangercheng
  • dangercheng
  • 2013年10月11日 15:47
  • 4707

java中内存泄露有几种?如何分析泄露原因

一、Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(He...
  • zhousenshan
  • zhousenshan
  • 2016年10月19日 22:34
  • 2506
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:什么是内存泄漏
举报原因:
原因补充:

(最多只允许输入30个字)