學習Java:垃圾回收與程式設計
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程式的暫停時間。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java培訓分享Java教程垃圾回收與演算法程式設計師Java演算法
- java學習筆記-4 JVM垃圾回收(GC)Java筆記JVMGC
- JAVA垃圾回收機制和Python垃圾回收對比與分析JavaPython
- 物件回收判定與垃圾回收演算法-JVM學習筆記(1)物件演算法JVM筆記
- Java 垃圾回收機制Java
- java垃圾回收機制Java
- 快速學習nodejs系列:十一、nodejs垃圾回收NodeJS
- JVM學習(二)——GC垃圾回收機制JVMGC
- Java程式設計師學習Rust程式設計 - infoworldJava程式設計師Rust
- Java網路程式設計基礎學習與整理Java程式設計
- Linux雲端計算技術學習:跟蹤JAVA虛擬機器的垃圾回收LinuxJava虛擬機
- 一文學會 Java 垃圾回收機制Java
- java垃圾回收機制整理Java
- 垃圾回收(三)【垃圾回收通知】
- Java進階10 記憶體管理與垃圾回收Java記憶體
- Java虛擬機器:JVM架構與垃圾回收Java虛擬機JVM架構
- java程式設計師程式設計筆試基礎學習Java程式設計師筆試
- Java學習之AWT GUI程式設計JavaGUI程式設計
- 學習Java程式設計的建議Java程式設計
- Java學習之Swing Gui程式設計JavaGUI程式設計
- 【java學習】GUI 圖形程式設計JavaGUI程式設計
- 《java學習二》併發程式設計Java程式設計
- 淺析堆與垃圾回收
- 淺談JVM與垃圾回收JVM
- 【JVM】程式設計師進階JVM(三)——7大 垃圾回收算器JVM程式設計師
- JAVA程式設計學習記錄(安裝Java)Java程式設計
- Java 垃圾回收01(基本過程)Java
- 垃圾回收(一)【垃圾回收的基礎】
- (UE4 4.20 )UE4的GC(垃圾回收)程式設計規範GC程式設計
- Java程式設計師需要學習的技能Java程式設計師
- Java 併發程式設計學習總結Java程式設計
- java面試一日一題:如何設計一款垃圾回收器Java面試
- 垃圾回收
- JVM垃圾回收器、記憶體分配與回收策略JVM記憶體
- 好程式設計師Java學習路線分享Java弱引用的理解與使用程式設計師Java
- Java經典垃圾回收器介紹Java
- java垃圾回收有哪些演算法Java演算法
- Java的垃圾回收(Garbage Collection)機制Java
- Java記憶體管理 -JVM 垃圾回收Java記憶體JVM