1. 程式人生 > >java物件的初始化和清理

java物件的初始化和清理

初始化和清理

對於初始化和清理(cleanup),C++引入了構造器(constructor)的概念,這是一個在建立物件時被自動呼叫的特殊方法,Java也採用了構造器,並額外提供了“垃圾回收器”; 1、使用構造器確保初始化 (1)Java中每個類都會有一個initialize()初始化方法:提醒在使用該類物件前,先呼叫initialize方法;即構造器方法,Java中構造器方法採用與類相同的名稱; (2)從概念上來講,“初始化”和“建立”是相互獨立的, 但在Java中,這兩個過程是捆綁在一起的; (3)在類的內部,變數定義的順序決定了初始化的順序,即使變數定義散佈在方法之間,它們仍舊會在任何方法(包括構造器)被呼叫前初始化;         初始化的順序是,先靜態物件,再非靜態物件;
        Java允許將多個靜態初始化動作組織為一個特殊的“靜態子句”(“靜態塊”),如: public class example{      static i;      static Cup cup1;      static {           i = 47;           cup1 = new cup1( );      } } 2、清理:確保處理和垃圾回收 Java允許在類中定義一個finalize()方法:一旦垃圾回收器準備好釋放物件佔用的儲存空間,會首先呼叫finalize方法,並在下一個垃圾回收動作發生時,才會真正回收物件佔用的記憶體; ①物件可能不被垃圾回收;
②垃圾回收不等於“析構”;垃圾回收通常會大量發生在記憶體瀕臨溢位的時間,以節省垃圾回收本身的開銷; ③垃圾回收只與記憶體有關; ※在每次物件的生存週期要對記憶體進行管理,可以在finalize方法中使用Java的本地方法(支援C/C++); 3、垃圾回收器的工作方式 (1)Java垃圾回收器將物件重新排列,實現一種高速地,有無限空間可分配的堆模型; (2)Java垃圾回收器的工作方式:自適應的、分代的 停止-複製(stop-and-copy)方式 + 標記-清掃(mark-and-sweep)方式; ①停止-複製(stop-and-copy)方式 先暫停程式的執行(不屬於後臺回收模式),將所有存活的物件從當前堆複製到另一個堆,沒有被複制的全部都是垃圾。當物件被複制到新堆時,它們的排列方式是一個挨一個的緊密排列; 這種方式的效率比較低,原因為:a.空間:需要兩個堆,所以需要維護比實際多一倍的空間; b.複製:程式在進入穩定狀態後,可能產生很少的垃圾,這種方式會很浪費資源; ②標記-清掃(mark-and-sweep)方式:
檢查是否有新垃圾產生,如果沒有,就會轉到這種工作方式; 從堆疊和靜態儲存區出發,遍歷所有的引用,找出所有存活的物件,當找到一個存活物件時,會給該物件進行標記,當所有標記完成後,再進行清理; 這種方式的速度很慢;