2010年8月1日 星期日

Java Garbage Collection (Java GC)

JVM使用的記憶體

Java Heap
1. Java 程式執行時,JVM 用來配置Java objects 的記憶體
2. GC 發生作用的記憶體
3. 預設值 (僅供參考)
*Xms大約都是4MB
*Xmx
1.AIX 為64MB
2.Windows 為實體記憶體的二分之一(16MB ~ 2GB -1)
3.Linux 為實體記憶體的二分之一(16MB ~ 512MB -1)

Native Heap

1. JVM 用來它內部運作的記憶體
2. JNI: Third party 的native module
3. 大小取決於產生的程式碼、產生的thread、GC 時用於保存javaobject 資訊
與產生或最佳化程式碼時的暫存空間
4. 預設值 (僅供參考) *128K(會隨著需求往上增長)

GC三部曲

1. Mark Phase
* 搜尋Java Heap 內全部的物件,找出已經沒有在使用中的物件
2. Sweep Phase
* 將無用的物件清除
3. Compaction Phase(optional)
*搬動物件,壓實Java Heap ,藉以移除物件之間的空白空間
*有些物件是無法搬動 Pinned (pointer 來自JNI, thread) , Dosed (pointer 來自stack)

GC的天時地利

* 當物件實體(Instance)沒有被參考時, 才允許被回收
* 參閱圖1範例判斷物件A~E,變成允許回收的順序 (A→B 為B被A所參考)
* 範例程式碼
    1: public void method1(){
2: Myclass a = new Myclass();
3: a = null; //步驟2產生的物件可以被gc

4: java.util.Date d = new java.util.Date();
5: d = new java.util.Date( long_date ); //步驟4產生的物件可以被gc
6: } //步驟5產生的物件可以被gc

*下面程式碼中A B C變成允許回收的順序?
     class OBJ{
private static A a = new A();
public B b = new B();

public void method1(){
C c = new C();
}
}


* 只能建議GC時機,但實際執行由JVM決定. 建議JVM執行GC方式如下
1. System.gc()
2. Runtime.getRuntime().gc()

* finalize()
1. finalize方法位於Java.Object
2. 當物件被JVM回收時會呼叫
3. 一般可用來手動釋放資源



From~http://chihhsiang-javaidea.blogspot.com/2007/10/java-garbage-collection.html

沒有留言:

張貼留言