什么是内存泄漏

转载 2018年04月15日 14:31:16

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


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


1.什么是内存泄漏?


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


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



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


2.为什么会发生内存泄漏?


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


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



3.如何阻止内存泄漏?


以下是一些阻止内存泄漏的快速动手技巧。

(1)注意集合类,例如HashMap,ArrayList,等等。因为它们是内存泄漏经常发生的地方。当它们被声明为静态时,它们的生命周期就同应用程序的生命周期一般长。

(2)注意事件监听器和回调,如果一个监听器已经注册,但是当这个类不再被使用时却未被注销,就会发生内存泄漏。

(3)“如果一个类管理它自己的内存,程序员应该对内存泄漏保持警惕。”[1] 很多时候当一个对象的成员变量指向其他对象时,不再使用时需要被置为。


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

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

内存泄漏与内存溢出的区别?

内存泄漏内存泄漏(memory leak): 是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。 一般我们所说的内存泄漏是...
  • zhang_jun_ling
  • zhang_jun_ling
  • 2016-03-30 20:47:11
  • 2517

什么是java内存泄漏?

转自:http://zhidao.baidu.com/link?url=z0-hAk2hk7pIRNEf5WLdvFzNvEtgInI4beXpoI4qxklTfPIFIhS4InGqPMYvKgQt...
  • suyu_yuan
  • suyu_yuan
  • 2016-08-04 12:48:10
  • 223

什么是JAVA的内存泄漏?

1:对象是可达的;2:对象对程序是无用的。此时内存就泄漏了。
  • YukiCEO
  • YukiCEO
  • 2009-06-10 12:56:00
  • 249

什么是内存泄漏?

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

什么是内存泄漏?

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

内存泄漏的定义以及为什么会内存泄漏,如何防止内存泄漏

内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。 内存泄漏形象...
  • xvjixiang
  • xvjixiang
  • 2014-02-27 21:57:08
  • 1099

什么是堆,栈,内存泄漏和内存溢出?

heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 一、预备知识—程序的内存...
  • qq_35212671
  • qq_35212671
  • 2016-12-10 23:36:56
  • 977

什么是野指针和内存泄漏?如何避免野指针

内存泄漏:①访问已经释放的内存     ②访问没有权限的内存 野指针:指向内存被释放的内存或者没有访问权限的内存的指针。 “野指针”的成因主要有3种: (1)指针变量没有被初始化。任何指针变...
  • qq_35212671
  • qq_35212671
  • 2016-07-15 20:35:48
  • 1614

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

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

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