Java對象創(chuàng)建內(nèi)存案例解析
Java對象創(chuàng)建內(nèi)存圖解析
1. 棧
- Java棧的區(qū)域很小 , 特點是存取的速度特別快,棧存儲的特點是, 先進后出,存儲速度快的原因: 棧內(nèi)存, 通過 棧指針'來創(chuàng)建空間與釋放空間,指針向下移動, 會創(chuàng)建新的內(nèi)存, 向上移動, 會釋放這些內(nèi)存。這種方式速度特別快 , 僅次于PC寄存器,但是這種移動的方式, 必須要明確移動的大小與范圍 ,明確大小與范圍是為了方便指針的移動 , 這是一個對于數(shù)據(jù)存儲的限制, 存儲的數(shù)據(jù)大小是固定的 , 影響了程序的靈活性。 所以我們把更大部分的數(shù)據(jù) 存儲到了堆內(nèi)存中存儲的是:基本數(shù)據(jù)類型的數(shù)據(jù) 以及 引用數(shù)據(jù)類型的引用。
例如:
int a =10;
Person p = new Person();
10存儲在棧內(nèi)存中 , 第二句代碼創(chuàng)建的對象的引用§存在棧內(nèi)存中
2. 堆
- 堆存放的是類的對象 ,Java是一個純面向?qū)ο笳Z言, 限制了對象的創(chuàng)建方式:所有類的對象都是通過new關鍵字創(chuàng)建new關鍵字, 是指告訴JVM, 需要明確的去創(chuàng)建一個新的對象 , 去開辟一塊新的堆內(nèi)存空間,堆內(nèi)存與棧內(nèi)存不同, 優(yōu)點在于我們創(chuàng)建對象時 , 不必關注堆內(nèi)存中需要開辟多少存儲空間 , 也不需要關注內(nèi)存占用時長,堆內(nèi)存中內(nèi)存的釋放是由GC(垃圾回收器)完成的垃圾回收器 回收堆內(nèi)存的規(guī)則:當棧內(nèi)存中不存在此對象的引用時,則視其為垃圾 , 等待垃圾回收器回收 。
3. 方法區(qū)
方法區(qū)存放的是:
- 類信息
- 靜態(tài)的變量
- 常量
- 成員方法
方法區(qū)中包含了一個特殊的區(qū)域 ( 常量池 )(存儲的是使用static修飾的成員)
創(chuàng)建內(nèi)存棧、堆、方法區(qū)圖析
舉個例子如下圖:

對象的引用存放在棧中,new創(chuàng)建Book()對象在堆內(nèi)存中開辟了一段內(nèi)存,內(nèi)存都是有地址的假設為0x123,棧內(nèi)存中存儲了地址,地址指向堆內(nèi)存,獲取了對象Book的屬性name、info,并賦值為"計算機",“計算機書籍”,如圖示:

接著BOOK book2 = book1,在棧內(nèi)存中又創(chuàng)建了一個區(qū)域,這個區(qū)域就是book2,也拿到book1的地址,通過book2調(diào)用將name改為"Java",接著在調(diào)用方放say()。整個過程如圖示:

結果如下:

- 方法結束整個過程完成后,變量對象使用完畢,因為它的作用域就這么大,將會被釋放,book2,book1先后出棧釋放,緊接著堆內(nèi)存的對象沒有任何棧內(nèi)存指向它,最后交給交給GC垃圾回收期處理。
這就是Java對象創(chuàng)建內(nèi)存到釋放內(nèi)存的一個過程。
到此這篇關于Java對象創(chuàng)建內(nèi)存案例解析的文章就介紹到這了,更多相關Java對象創(chuàng)建內(nèi)存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
maven插件assembly使用及springboot啟動腳本start.sh和停止腳本 stop.sh
這篇文章主要介紹了maven插件assembly使用及springboot啟動腳本start.sh和停止腳本 stop.sh的相關資料,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
java實現(xiàn)基于TCP協(xié)議網(wǎng)絡socket編程(C/S通信)
這篇文章主要介紹了java實現(xiàn)基于TCP協(xié)議網(wǎng)絡socket編程(C/S通信),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10
Javaweb實現(xiàn)在線人數(shù)統(tǒng)計代碼實例
這篇文章主要介紹了Javaweb實現(xiàn)在線人數(shù)統(tǒng)計代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11
如何利用Spring?Boot?監(jiān)控?SQL?運行情況
這篇文章主要介紹了如何利用Spring?Boot監(jiān)控SQL運行情況,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07

