【本節目标】
通過閱讀本章,你将通過多組執行個體從記憶體上深度了解通過對象聲明、方法調用等方法進行引用傳遞的原理,并深刻了解引用為何會産生記憶體垃圾以及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() ; //進行方法的調用
}
}

圖一 記憶體分析結果一
圖二 運作結果一
這個時候的引用傳遞是直接在主方法之中定義的,也可以通過方法實作引用傳遞
範例:利用方法實作引用傳遞處理
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 ;
}
}
圖三 運作結果二
圖四 記憶體分析結果二
與之前的差别最大的地方在于,此時的程式是将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(Garbage Collector、垃圾收集器)不定期進行回收并且釋放無用記憶體空間,但是如果垃圾過多,一定将影響到GC的處理性能,進而降低整體的程式性能。那麼在實際開發之中,對于垃圾的産生應該越少越好。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:保守VS開放?搞懂封裝對象屬性 | 帶你學《Java面向對象程式設計》之四 更多Java面向對象程式設計文章檢視此處