天天看點

對象“變形記”——初識引用與GC | 帶你學《Java面向對象程式設計》之三

上一篇:帶你“找對象”--Java記憶體分析 | 帶你學《Java面向對象程式設計》之二

【本節目标】

通過閱讀本章,你将通過多組執行個體從記憶體上深度了解通過對象聲明、方法調用等方法進行引用傳遞的原理,并深刻了解引用為何會産生記憶體垃圾以及GC機制的相關内容。

3.1 引用傳遞分析

類本身屬于引用資料類型,既然是引用資料類型,那麼就牽扯到記憶體的引用傳遞,所謂的引用傳遞的本質:同一塊堆記憶體的空間可以被不同的棧記憶體所指向,也可以更換指向。

範例:定義一個引用傳遞的分析程式

public class JavaDemo {
    public static void main(String args[]) {
      Person per1 = new Person() ;     //聲明并執行個體化對象
      per1.name = “張三” ;
      per1.age = 18 ;
      Person per2 = per1 ; //引用傳遞
      per2.age =80 ;
      per1.tell() ;            //進行方法的調用
   }
}           
對象“變形記”——初識引用與GC | 帶你學《Java面向對象程式設計》之三

圖一 記憶體分析結果一

對象“變形記”——初識引用與GC | 帶你學《Java面向對象程式設計》之三

圖二 運作結果一

這個時候的引用傳遞是直接在主方法之中定義的,也可以通過方法實作引用傳遞

範例:利用方法實作引用傳遞處理

public class JavaDemo {
    public static void main(String args[]) {
      Person per = new Person() ;     //聲明并執行個體化對象
      per.name = “張三” ;
      per.age = 18 ;
      change(per) ;     //等價于:Person temp = per ;
      per.tell() ;            //進行方法的調用
}
public static void change(Person  temp){
    temp.age = 80 ;
   }
}           
對象“變形記”——初識引用與GC | 帶你學《Java面向對象程式設計》之三

圖三 運作結果二

對象“變形記”——初識引用與GC | 帶你學《Java面向對象程式設計》之三

圖四 記憶體分析結果二

與之前的差别最大的地方在于,此時的程式是将Person類的執行個體化對象(記憶體位址、數值)傳遞到了change方法之中,由于傳遞的是一個Person類型,那麼change()方法接收的也是Person類型。

引用傳遞可以發生在方法上,這個時候一定要觀察方法的參數類型,同時也要觀察方法的執行過程。

3.2 引用與垃圾産生分析

經過一系列分析後,所有的引用傳遞的本質就是一場堆記憶體的調戲遊戲。但是對于引用傳遞,如果處理不當,那麼也會造成垃圾的産生,那麼本次将針對于垃圾産生的原因進行簡單分析。

範例:定義一個要分析的程式

public class JavaDemo {
    public static void main(String args[]) {
      Person per1 = new Person() ;     //聲明并執行個體化對象
      Person per2 = new Person() ;
      per1.name = “張三” ;
      per1.age = 18 ;
      per2.name = “李四” ; 
      per2.age =19 ;
      per2 = per1 ;         //引用傳遞
      per2.age =80 ;
      per1.tell() ;            //進行方法的調用
   }
}           
對象“變形記”——初識引用與GC | 帶你學《Java面向對象程式設計》之三

圖五 運作結果三

此時已經明确發生了引用傳遞,并且也成功的完成了引用傳遞的處理操作,但是下面來觀察一下其記憶體的配置設定與處理操作。

一個棧記憶體隻能夠儲存有一個一堆記憶體的位址資料,如果發生更改,則之前的位址資料将從此棧記憶體中徹底消失。下面來看看它的記憶體分析結果。

對象“變形記”——初識引用與GC | 帶你學《Java面向對象程式設計》之三

圖六 記憶體分析結果三

所謂的垃圾空間指的就是沒有任何棧記憶體所指向的堆記憶體空間,所有的垃圾将被GC(Garbage Collector、垃圾收集器)不定期進行回收并且釋放無用記憶體空間,但是如果垃圾過多,一定将影響到GC的處理性能,進而降低整體的程式性能。那麼在實際開發之中,對于垃圾的産生應該越少越好。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:保守VS開放?搞懂封裝對象屬性 | 帶你學《Java面向對象程式設計》之四 更多Java面向對象程式設計文章檢視此處