Java中的垃圾回收

孫群發表於2015-06-01

關於Java垃圾回收機制的幾點:

1. What ?

Java中除了基本型別之外都是物件,基本型別分配的是堆疊記憶體,物件時通過new分配的堆記憶體。不同於C或C++,物件沒有解構函式,Java是通過垃圾回收機制回收物件的內粗的。也就是當一個物件沒有被其他物件或變數使用和引用的時候,該物件就屬於無用的物件,在某種情況下,Java的垃圾回收機制就會回收這些無用的物件,以釋放堆記憶體。


2. When ?

垃圾回收需要開銷,所以Java虛擬機器在記憶體充裕時有可能不會對無用的物件進行垃圾回收,也就是垃圾回收在程式執行的過程中沒有進行。在系統瀕臨記憶體耗盡的情況下,垃圾回收通常會進行。如果在程式退出的時候垃圾回收還一直沒有進行,那麼隨之程式的退出,分配在堆上的記憶體空間等資源會交付給作業系統。也就是說垃圾回收是需要開銷的,垃圾回收只會在必要的時候進行,這種垃圾回收機制並不保證程式執行過程中進行。


3. How ?

垃圾回收是否在程式執行期間執行是通過Java虛擬機器對當前系統記憶體的緊迫程度的判斷決定的,如果想在程式執行的某個時刻希望執行垃圾回收,可以呼叫System.gc()。該程式碼的作用是告知Java虛擬機器希望執行一次垃圾回收,但是並不保證該程式碼一定會讓Java虛擬機器進行垃圾回收。


4. finalize

在垃圾回收執行(如果Java虛擬機器執行了垃圾回收)對某一個物件進行垃圾回收時,會呼叫該物件的finalize方法,該方法是基類Object的一個方法,可以在finalize方法中執行一些清理以及資源釋放操作,比如在物件中通過呼叫C或C++通過malloc分配了記憶體,那麼就可以在finalize中呼叫相應的free函式釋放掉之前分配的記憶體。由此看來Java物件中的finalize方法有點類似於C++中的解構函式。最佳實踐是除了記憶體以外,不能依賴垃圾回收器去做任何事,如果需要進行清理,最好是編寫你自己的清理方法(比如編寫名為dispose之類的方法),然後在確定要清理的時候手動呼叫該自定義的清理方法。

相關文章