Java對象創(chuàng)建內存案例解析
Java對象創(chuàng)建內存圖解析
1. 棧
- Java棧的區(qū)域很小 , 特點是存取的速度特別快,棧存儲的特點是, 先進后出,存儲速度快的原因: 棧內存, 通過 棧指針'來創(chuàng)建空間與釋放空間,指針向下移動, 會創(chuàng)建新的內存, 向上移動, 會釋放這些內存。這種方式速度特別快 , 僅次于PC寄存器,但是這種移動的方式, 必須要明確移動的大小與范圍 ,明確大小與范圍是為了方便指針的移動 , 這是一個對于數(shù)據(jù)存儲的限制, 存儲的數(shù)據(jù)大小是固定的 , 影響了程序的靈活性。 所以我們把更大部分的數(shù)據(jù) 存儲到了堆內存中存儲的是:基本數(shù)據(jù)類型的數(shù)據(jù) 以及 引用數(shù)據(jù)類型的引用。
例如:
int a =10;
Person p = new Person();
10存儲在棧內存中 , 第二句代碼創(chuàng)建的對象的引用§存在棧內存中
2. 堆
- 堆存放的是類的對象 ,Java是一個純面向對象語言, 限制了對象的創(chuàng)建方式:所有類的對象都是通過new關鍵字創(chuàng)建new關鍵字, 是指告訴JVM, 需要明確的去創(chuàng)建一個新的對象 , 去開辟一塊新的堆內存空間,堆內存與棧內存不同, 優(yōu)點在于我們創(chuàng)建對象時 , 不必關注堆內存中需要開辟多少存儲空間 , 也不需要關注內存占用時長,堆內存中內存的釋放是由GC(垃圾回收器)完成的垃圾回收器 回收堆內存的規(guī)則:當棧內存中不存在此對象的引用時,則視其為垃圾 , 等待垃圾回收器回收 。
3. 方法區(qū)
方法區(qū)存放的是:
- 類信息
- 靜態(tài)的變量
- 常量
- 成員方法
方法區(qū)中包含了一個特殊的區(qū)域 ( 常量池 )(存儲的是使用static修飾的成員)
創(chuàng)建內存棧、堆、方法區(qū)圖析
舉個例子如下圖:
對象的引用存放在棧中,new創(chuàng)建Book()對象在堆內存中開辟了一段內存,內存都是有地址的假設為0x123,棧內存中存儲了地址,地址指向堆內存,獲取了對象Book的屬性name、info,并賦值為"計算機",“計算機書籍”,如圖示:
接著BOOK book2 = book1,在棧內存中又創(chuàng)建了一個區(qū)域,這個區(qū)域就是book2,也拿到book1的地址,通過book2調用將name改為"Java",接著在調用方放say()。整個過程如圖示:
結果如下:
- 方法結束整個過程完成后,變量對象使用完畢,因為它的作用域就這么大,將會被釋放,book2,book1先后出棧釋放,緊接著堆內存的對象沒有任何棧內存指向它,最后交給交給GC垃圾回收期處理。
這就是Java對象創(chuàng)建內存到釋放內存的一個過程。
到此這篇關于Java對象創(chuàng)建內存案例解析的文章就介紹到這了,更多相關Java對象創(chuàng)建內存內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Cloud Alibaba 本地調試介紹及方案設計
為了解決 本地調試 的問題,本文實現(xiàn)了一種簡單實用的策略,可以通過 Nacos 動態(tài)配置服務路由,還可以基于用戶,部門,組織等級別配置服務路由,實現(xiàn) 本地調試 的同時,實際上也實現(xiàn) 灰度發(fā)布,感興趣的朋友跟隨小編一起看看吧2021-07-07SpringBoot 如何實現(xiàn)自定義Redis序列化
這篇文章主要介紹了SpringBoot 如何實現(xiàn)自定義Redis序列化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10MybatisPlus實現(xiàn)真正批量插入的詳細步驟
在數(shù)據(jù)庫操作中,批量插入是提升效率的重要手段,MyBatis-Plus提供了多種批量插入方法,但默認的saveBatch方法效率并不高,文章介紹了通過手動拼接SQL、使用IService接口以及自定義insertBatchSomeColumn方法進行優(yōu)化,以實現(xiàn)更高效的批量插入,并給出了性能優(yōu)化建議2024-10-10