天天看點

Java垃圾收集器

 垃圾收集器(GarbageCollector,GC)是現代軟體虛拟機技術的重要組成部分,其設計方案對運作于虛拟機上的應用程式性能影響極大。 Java虛拟機(JVM)與.netFramework都提供了這一功能。下面我們簡單介紹一下Java虛拟機中的垃圾收集器原理。

Java的記憶體管理實際上就是對象的管理,其中包括對象的配置設定和釋放。

對于程式員來說,配置設定對象使用new關鍵字;釋放對象時,隻要将對象所有引用指派為null。對于GC來說,當程式員建立對象時,GC就開始監控這個 對象的位址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式确定哪些對象是"可達的",哪些對象是" 不可達的"。當GC确定一些對象為"不可達"時,GC就有責任回收這些記憶體空間。

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

根據GC的工作原理,我們可以通過一些技巧和方式,讓GC運作更加有效率,更加符合應用程式的要求。

以下就是一些程式設計的幾點建議。

1.最基本的建議就是盡早釋放無用對象的引用。

大多數程式員在使用臨時變量的時候,都是讓引用變量在退出活動域(scope)後,自動設定為null。

2.盡量少用finalize函數。finalize函數是Java提供給程式員一個釋放對象或資源的機會。但是,它會加大GC的工作量,是以盡量少采用finalize方式回收資源。

3.如果需要使用經常使用的圖檔,可以使用soft應用類型。它可以盡可能将圖檔儲存在記憶體中,供程式調用,而不引起OutOfMemory。

4.注意集合資料類型,包括數組,樹,圖,連結清單等資料結構,對于這類對象,GC回收它們一般效率較低。如果程式允許,盡早将不用的引用對象賦為null。這樣可以加速GC的工作。是以,如非必要,程式中采用的資料結構要盡可能地簡單。

5.當程式有一定的等待時間,程式員可以手動執行System.gc(),通知GC運作,但是Java語言規範并不保證GC一定會執行。

繼續閱讀