Java內存泄露簡述

Java的一個最顯著的優點是內存管理。你只須要簡單的建立對象而不須要負責釋放空間,由於Java的垃圾回收器會負責內存的回收。然而,狀況並非這樣簡單,內存泄露仍是常常會在Java應用程序中出現。web

本篇文章將介紹什麼是內存泄露,爲何會發生,以及怎樣阻止內存泄露。spa

什麼是內存泄露

內存泄露的定義:對於應用程序來講,當對象已經再也不被使用,可是Java的垃圾回收器不能回收它們的時候,就產生了內存泄露。對象

要理解這個定義,咱們須要理解對象在內存中的狀態。以下圖所示,展現了哪些對象是無用對象,哪些是未被引用的對象;blog

上圖中包含了未引用對象和引用對象。未引用對象將會被垃圾回收器回收,而引用對象卻不會。未引用對象很顯然是無用的對象。然而,無用的對象並不都是未引用對象,有一些無用對象也有多是引用對象,這部分對象正是內存泄露的來源。生命週期

爲何內存泄露會發生

讓咱們用下面的例子來看看爲何會發生內存泄露。以下圖所示,對象A引用對象B,A的生命週期(t1-t4)比B的生命週期(t2-t3)要長,當B在程序中再也不被使用的時候,A仍然引用着B。在這種狀況下,垃圾回收器是不會回收B對象的,這就可能形成了內存不足問題,由於A可能不止引用着B對象,還可能引用其它生命週期比A短的對象,這就形成了大量無用對象不能被回收,且佔據了昂貴的內存資源。事件

一樣的,B對象也可能引用着一大堆對象,這些被B對象引用着的對象也不能被垃圾回收器回收,全部的這些無用對象消耗了大量內存資源。內存

怎樣阻止內存泄露

如下是一些阻止內存泄露的經驗提示:資源

  1. 多關注集合類,好比HashMap,ArrayList等,這些對象常常會發生內存泄露。好比當它們被聲明爲靜態對象時,它們的生命週期會跟應用程序的生命週期同樣長,很容易形成內存不足。
  2. 多關注事件監聽(listeners)和回調(callbacks),好比註冊了一個listener,當它再也不被使用的時候,忘了註銷該listener,可能就會產生內存泄露。
  3. 「若是一個類本身管理本身的內存空間,開發人員須要特別警戒內存泄露」,引用其它對象的成員變量記得要置爲null?不太理解(原文:Often times member variables of an object that point to other objects need to be null out)

小測驗:爲何jdk 6的substring()方法會致使內存泄露

詳情請看如下連接:
http://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/
開發

 

譯文連接:http://www.programcreek.com/2013/10/the-introduction-of-memory-leak-what-why-and-how/get

相關文章
相關標籤/搜索