Java對象創(chuàng)建內(nèi)存案例解析
Java對象創(chuàng)建內(nèi)存圖解析
1. 棧
- Java棧的區(qū)域很小 , 特點是存取的速度特別快,棧存儲的特點是, 先進(jìn)后出,存儲速度快的原因: 棧內(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關(guān)鍵字創(chuàng)建new關(guān)鍵字, 是指告訴JVM, 需要明確的去創(chuàng)建一個新的對象 , 去開辟一塊新的堆內(nèi)存空間,堆內(nèi)存與棧內(nèi)存不同, 優(yōu)點在于我們創(chuàng)建對象時 , 不必關(guān)注堆內(nèi)存中需要開辟多少存儲空間 , 也不需要關(guān)注內(nèi)存占用時長,堆內(nèi)存中內(nèi)存的釋放是由GC(垃圾回收器)完成的垃圾回收器 回收堆內(nèi)存的規(guī)則:當(dāng)棧內(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)存都是有地址的假設(shè)為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()。整個過程如圖示:
結(jié)果如下:
- 方法結(jié)束整個過程完成后,變量對象使用完畢,因為它的作用域就這么大,將會被釋放,book2,book1先后出棧釋放,緊接著堆內(nèi)存的對象沒有任何棧內(nèi)存指向它,最后交給交給GC垃圾回收期處理。
這就是Java對象創(chuàng)建內(nèi)存到釋放內(nèi)存的一個過程。
到此這篇關(guān)于Java對象創(chuàng)建內(nèi)存案例解析的文章就介紹到這了,更多相關(guān)Java對象創(chuàng)建內(nèi)存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud Alibaba 本地調(diào)試介紹及方案設(shè)計
為了解決 本地調(diào)試 的問題,本文實現(xiàn)了一種簡單實用的策略,可以通過 Nacos 動態(tài)配置服務(wù)路由,還可以基于用戶,部門,組織等級別配置服務(wù)路由,實現(xiàn) 本地調(diào)試 的同時,實際上也實現(xiàn) 灰度發(fā)布,感興趣的朋友跟隨小編一起看看吧2021-07-07SpringBoot 如何實現(xiàn)自定義Redis序列化
這篇文章主要介紹了SpringBoot 如何實現(xiàn)自定義Redis序列化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10MybatisPlus實現(xiàn)真正批量插入的詳細(xì)步驟
在數(shù)據(jù)庫操作中,批量插入是提升效率的重要手段,MyBatis-Plus提供了多種批量插入方法,但默認(rèn)的saveBatch方法效率并不高,文章介紹了通過手動拼接SQL、使用IService接口以及自定義insertBatchSomeColumn方法進(jìn)行優(yōu)化,以實現(xiàn)更高效的批量插入,并給出了性能優(yōu)化建議2024-10-10