1. 程式人生 > >Java 物件記憶體分析

Java 物件記憶體分析

> 一直對堆記憶體和棧記憶體搞不明白,最近看了一個視訊,有了新的瞭解,在這裡給大家分享一下 ### 物件記憶體與引用 #### 物件 好多剛入門學習 Java 的人總是搞不清楚類和物件的關係,在這裡簡要說明一些。 類:顧名思義,一類東西,比如女孩、男孩、人、狗狗,都是類(class),瑩瑩、小明、團團,則是物件(object)。 也可以理解為物件是類的具體化(例項),類是泛指,物件是有具體指向。 class Dog 中,Dog 是類 ```java public class Dog { public String color; public String name; public Integer age; } ``` tuan = new Dog 中,tuan 是物件,是 Dog 類的例項,每個狗狗的名字,顏色、年齡,都不一樣。 ```java tuan = new Dog(); tuan->color = "white"; tuan->name = "tuan"; tuan->age = 3; ``` 這樣我們就定義了一個完整的物件 tuan,可以看到,類只是定義了狗應該有的屬性,名字,年齡,顏色,但是並沒有說明是什麼樣的狗,物件則指向具體是哪隻狗狗,狗狗名字是什麼,年齡多少,顏色是什麼。 ### 記憶體 可以簡單的理解一個電影院,有多少位置。比如有100個位置,則記憶體就是100。 堆記憶體:儲存物件的具體資訊,比如:第三排,第三號的座位 C,則 C 的具體資訊(座椅大小、材質、柔軟度、顏色,能否調節),就儲存在堆記憶體中 棧記憶體:儲存物件的位置,比如:第三排,第三號(位置為 33 號),則 33 號儲存在棧記憶體中 ![](https://img2020.cnblogs.com/blog/1410693/202011/1410693-20201130223244495-2038292353.png) 關係如上圖,一個座位號對應一個座位。eg: public class Site{}, Site 是位置資訊,c = new Site()。當我們 new 一個物件時,就會在堆記憶體中開闢一個空間,儲存物件資訊。比如,在電影院裡3排3座放一個椅子,這個椅子叫做 c,他的位置是3排3號(電影票,在取票箱中),我們可以根據電影票找到對應的座椅。座椅是有屬性的,c->size = 23,則對應的儲存資訊如下圖: ![](https://img2020.cnblogs.com/blog/1410693/202011/1410693-20201130224608443-12386693.png) #### 引用 可以簡單暴力的理解為引用物件的地址,即棧記憶體中的地址,比如: ```java c = new Site(); c->size = 23; // c1 引用 c 的地址 c1 = c; // return c1->size; 輸出: 23 c1->size = 24; //return c->size; 輸出: 24 // 由於 c 和 c1 指向的都是同一個物件,因此改動之後都會變化 ``` ![](https://img2020.cnblogs.com/blog/1410693/202012/1410693-20201202081210043-360529922.png) ### 記憶體垃圾 ```java c = new Site(); d = new Site(); d = c; // d 和 c 指向一個物件 ``` > 垃圾記憶體不能再被使用,但仍然佔據記憶體空間不放,在隨後的一個不確定的時間被垃圾回收器收走(釋放掉 如下圖: ![](https://img2020.cnblogs.com/blog/1410693/202012/1410693-20201203224824570-1574649902.png) 本文參考視訊: [Java 面向物件程式設計](https://edu.aliyun.com/lesson_1011_8798?spm=5176.10731542.0.0.47f16d9fSfbMx