學習Java:垃圾回收與程式設計

zybing發表於2007-08-23
GC的基本原理,以及如何有效的使用GC來程式設計[@more@]
GC的基本原理

Java的記憶體管理實際上就是物件的管理,其中包括物件的分配和釋放。對於GC來說,當程式設計師建立物件時,GC就開始監控這個物件的地址、大小以及使用情況。通常,GC採用有向圖的方式記錄和管理堆(heap)中的所有物件.

GC在JVM中通常是由一個或一組程式來實現的,它本身也和使用者程式一樣佔用heap空間,執行時也佔用CPU。當GC程式執行時,應用程式停止執行。因此,當GC執行時間較長時,使用者能夠感到Java程式的停頓,另外一方面,如果GC執行時間太短,則可能物件回收率太低,這意味著還有很多應該回收的物件沒有被回收,仍然佔用大量記憶體。因此,在設計GC的時候,就必須在停頓時間和回收率之間進行權衡。

增量式GC( Incremental GC )
Sun JDK提供的HotSpot JVM就能支援增量式GC。HotSpot JVM預設GC方式為不使用增量GC,為了啟動增量GC,我們必須在執行Java程式時增加-Xincgc的引數。HotSpot JVM增量式GC的實現是採用Train GC演算法。它的基本想法就是,將堆中的所有物件按照建立和使用情況進行分組(分層),將使用頻繁高和具有相關性的物件放在一隊中,隨著程式的執行,不斷對組進行調整。當GC執行時,它總是先回收最老的(最近很少訪問的)的物件,如果整組都為可回收物件,GC將整組回收。這樣,每次GC執行只回收一定比例的不可達物件,保證程式的順暢執行。Train GC演算法是一個非常好的演算法,

finalize函式:
再次強調,不要把資源回收的工作放在finalize中,不穩定不保險。

程式如何與GC進行互動:
Java2增強了記憶體管理功能,增加了一個java.lang.ref包,其中定義了三種引用類。這三種引用類分別為SoftReference、WeakReference和 PhantomReference。透過使用這些引用類,程式設計師可以在一定程度與GC進行互動,以便改善GC的工作效率。這些引用類的引用強度介於可達物件和不可達物件之間。

Soft Reference的主要特點是據有較強的引用功能。只有當記憶體不夠的時候,才進行回收這類記憶體,因此在記憶體足夠的時候,它們通常不被回收。另外,這些引用物件還能保證在Java丟擲OutOfMemory 異常之前,被設定為null。它可以用於實現一些常用圖片的快取,實現Cache的功能,保證最大限度的使用記憶體而不引起OutOfMemory。

Weak引用物件與Soft引用物件的最大不同就在於:GC在進行回收時,需要透過演算法檢查是否回收Soft引用物件,而對於Weak引用物件,GC總是進行回收。Weak引用物件更容易、更快被GC回收。雖然,GC在執行時一定回收Weak物件,但是複雜關係的Weak物件群常常需要好幾次GC的執行才能完成。Weak引用物件常常用於Map結構中,引用資料量較大的物件,一旦該物件的強引用為null時,GC能夠快速地回收該物件空間

Phantom引用的用途較少

一些Java編碼的建議

根據GC的工作原理,我們可以透過一些技巧和方式,讓GC執行更加有效率,更加符合應用程式的要求。以下就是一些程式設計的幾點建議。

1. 最基本的建議就是儘早釋放無用物件的引用。大多數程式設計師在使用臨時變數的時候,都是讓引用變數在退出活動域(scope)後,自動設定為null。我們在使用這種方式時候,必須特別注意一些複雜的物件圖,例如陣列,佇列,樹,圖等,這些物件之間有相互引用關係較為複雜。對於這類物件,GC回收它們一般效率較低。如果程式允許,儘早將不用的引用物件賦為null。這樣可以加速GC的工作。
2. 儘量少用finalize函式。finalize函式是Java提供給程式設計師一個釋放物件或資源的機會。但是,它會加大GC的工作量,因此儘量少採用finalize方式回收資源。
3. 如果需要使用經常使用的圖片,可以使用soft應用型別。它可以儘可能將圖片儲存在記憶體中,供程式呼叫,而不引起OutOfMemory。
4. 注意集合資料型別,包括陣列,樹,圖,連結串列等資料結構,這些資料結構對GC來說,回收更為複雜。另外,注意一些全域性
的變數,以及一些靜態變數。這些變數往往容易引起懸掛物件(dangling reference),造成記憶體浪費。
5. 當程式有一定的等待時間,程式設計師可以手動執行System.gc(),通知GC執行,但是Java語言規範並不保證GC一定會執行。使用增量式GC可以縮短Java程式的暫停時間。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/855/viewspace-965123/,如需轉載,請註明出處,否則將追究法律責任。

相關文章