程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java提高篇—— 簡單介紹Java 的內存洩漏,簡單介紹java

Java提高篇—— 簡單介紹Java 的內存洩漏,簡單介紹java

編輯:JAVA綜合教程

Java提高篇—— 簡單介紹Java 的內存洩漏,簡單介紹java


  java最明顯的一個優勢就是它的內存管理機制。你只需簡單創建對象,java的垃圾回收機制負責分配和釋放內存。然而情況並不像想像的那麼簡單,因為在Java應用中經常發生內存洩漏。

本教程演示了什麼是內存洩漏,為什麼會發生內存洩漏以及如何預防內存洩漏。

什麼是內存洩漏?

定義:如果對象在應用中不再被使用,但由於它們在其他地方被引用,垃圾回收卻不能移除它們(這樣就造成了很多內存不能釋放,從而導致內存溢出的現象。譯注)。

要理解這一定義,我們需要理解內存中對象的狀態。下圖說明了那些是未使用,那些是未引用。

where-is-memory-leak

從圖中可以看到被引用對象和未引用對象(的范圍)。未引用對象可以被垃圾回收機制回收,而被引用對象不能被垃圾回收機制回收。未引用對象當然是沒有使用的,因為沒有其他對象引用了它。然而未使用對象並不都是未引用的。某些未使用的對象仍然被其他地方引用!這就是內存洩漏起因。

為什麼會發生內存洩漏?

讓我們來下面的這個例子,看看為什麼會發生內存洩漏。在如下例子中,A對象引用了B對象。A的生命周期(t1-t4)比B的生命周期(t2-t3)要長的多,當B不再在應用中被使用,A仍然持有對B的引用。這樣一來,垃圾回收機制不能從內存中移除B。這很有可能導致內存溢出問題,因為如果其他很多對象像A一樣,那麼內存中將會有很多不能被回收的對象,這將消耗大量內存空間。

也有可能的情況是B持有了大量對其他對象的引用。這些被B引用的對象同樣不會被回收掉。所有這些未使用的對象將會消耗寶貴的內存空間。 

如何預防內存洩漏?

如下是一些預防內存洩漏的快速技巧:

1、留意集合類,比如HashMap,ArrayList等等,因為他們是內存洩漏經常發生的地方。當它們被聲明為靜態對象時,他們的生命周期就和應用的生命周期一樣長。

2、留意事件監聽器和回調。如果一個類注冊了監聽器,但當該類不再被使用後沒有注銷監聽器,可能會發生內存洩漏。

3、“如果一個類管理自己的內存,程序員應該警惕內存洩漏。”[1],很多時候對象中的指向其他對象成員變量需要設置成null(才能被回收)。

一個小測驗:為什麼JDK6中的substring()方法會引發內存洩漏?

要回答這個問題,你可能需要查看JDK6和7中substring()的源碼。

參考文獻:
1. Bloch, Joshua. Effective java. Addison-Wesley Professional, 2008.
2. IBM Developer Work. http://www.ibm.com/developerworks/library/j-leaks/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved