国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

淺談Java內存區域劃分和內存分配策略

瀏覽:82日期:2022-09-01 15:13:40

如果不知道,類的靜態變量存儲在那? 方法的局部變量存儲在那? 趕快收藏

Java內存區域主要可以分為共享內存,堆、方法區和線程私有內存,虛擬機棧、本地方法棧和程序計數器。如下圖所示,本文將詳細講述各個區域,同時也會講述創建對象過程,內存分配策略, 和對象訪問定位原理。覺得寫得好的,可以點個收藏,絕對不虧。

淺談Java內存區域劃分和內存分配策略

Java內存區域

程序計數器

程序計數器,可以看作程序當前線程所執行的字節碼行號指示器。字節碼解釋器工作時就是通過改變計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理都需要依賴計數器完成。線程執行Java方法時,記錄其正在執行的虛擬機字節碼指令地址,線程執行Native方法時,計數器記錄為空。程序計數器時唯一在Java虛擬機規范中沒有規定任何OutOfMemoryError情況區域。

理論可知,線程是通過輪流獲取CPU執行時間以實現多線程的并發。為了暫停的線程下一次獲得CPU執行時間,能正常運行,每一個線程內部都需要維護一個程序計數器,用來記住暫停線程暫停的位置。

注意:光理論是不夠的,在此送大家一套2020最新Java架構實戰教程+大廠面試寶典,點擊此處 進來獲取 一起交流進步哦!

Java虛擬機棧

Java虛擬機棧同程序計數器一樣,也是線程私有的,虛擬機棧描述的是Java方法執行的內存模型,每個方法在執行的同時都會創建一個棧幀,用于存儲局部變量表,操作數棧、動態鏈接和方法出入口等信息。每一個方法從調用直至執行完成的過程,就對應著一個棧幀在虛擬機中入棧到出棧的過程。

本地方法棧

與虛擬機棧相似。虛擬機棧為虛擬機執行Java方法服務,而本地方法棧則為虛擬機使用到的Native方法服務。

Java堆

所有線程共享的一塊內存區域。Java虛擬機所管理的內存中最大的一塊,因為該內存區域的唯一目的就是存放對象實例。幾乎所有的對象實例都在這里分配內存,同時堆也是垃圾收集器管理的主要區域。因此很多時候被稱為'GC堆'

方法區

和堆一樣,是各個線程共享的內存區域,用于存儲已被虛擬機加載的類信息、常量、靜態變量、和編譯器編譯后的代碼(也就是存儲字節碼文件.class)等數據。

方法區中有一個運行時常量池,編譯后期生成的各種字面量和符號引用,存放在字節碼文件中的常量池中。當類加載進入方法區時,就會把該常量池中的內容放入方法區中的運行時常量池。此外也可以在程序運行期間,將新的常量放入運行時常量池,比如String.intern()方法,該方法先從運行時常量池中查找是否有該值,如果有,則返回該值的引用,否則將該值加入運行時常量池。

實例詳講

class Demo1_Car{ public static void main(String[] args) { Car c1 = new Car(); //調用屬性并賦值 c1.color = 'red'; c1.num = 8; //調用行為 c1.run(); Car c2 = new Car(); c2.color = 'black'; c2.num = 4; c2.run(); }}Class Car{ String color; int num; public void run() { System.out.println(color + '..' + num);}}

淺談Java內存區域劃分和內存分配策略

首先運行程序,Demo1_car.java就會變為Demo1_car.class,Demo1_car.class加入方法區,檢查是否字節碼文件常量池中是否有常量值,如果有,那么就加入運行時常量池。 遇到main方法,創建一個棧幀,入虛擬機棧,然后開始運行main方法中的程序。 Car c1 = new Car(), 第一次遇到Car這個類,所以將Car.java編譯為Car.class文件,然后加入方法區.然后new Car(),在堆中創建一塊區域,用于存放創建出來的實例對象,地址為0X001.其中有兩個屬性值color和num。默認值是null和 0 然后通過c1這個引用變量去設置color和num的值,調用run方法,然后會創建一個棧幀,用來存儲run方法中的局部變量等。run 方法中就打印了一句話,結束之后,該棧幀出虛擬機棧。又只剩下main方法這個棧幀。 接著又創建了一個Car對象,所以又在堆中開辟了一塊內存,之后就是跟之前的步驟一樣了。

創建對象過程

虛擬機在遇到一條new指令時,會首先檢查這個指令的參數是否可以在方法區中定位到一個類的符號引用,并且檢查這個符號引用所代表的類是否已經被加載,解析和初始化過。如果沒有,則必須先執行類加載過程.

類加載完之后,需要為對象分配內存,有兩種分配內存的方法

指針碰撞法(要求堆內存規整)

Java堆中空閑內存和已使用內存分別存放在堆的兩邊,中間存放一個指針作為分界點的指示器,在為對象分配內存時只需要將指針向空閑區域移動創建對象所需要的內存大小即可。

空閑列表法

如果堆內存中已使用內存區域和空閑區域相互交錯,此時虛擬機需要維護一個列表,記錄哪些內存塊是可用的,在分配時從列表中找到一塊足夠大的內存區域劃分給對象實例并更新列表上的記錄。

多線程情況下,線程同時分配內存可能會造成沖突,比如使用指針碰撞法,線程A正在分配內存,還沒有改變指針指向,線程B,又同時使用原來的指針進行內存分配。防止沖突有兩種方法

CAS操作:虛擬機采用CAS操作,加上失敗重試的方式保證內存分配的原子性 本地線程分配緩沖(TLAB):預先為線程分配一部分堆內存空間(線程私有,所以不存在同步問題)用于對象實例的內存分配。只有當TLAB用完,需要分配新的TLAB時,才需要進行同步操作。

內存分配完之后,虛擬機需要將分配到的內存空間均初始化為零值(不包括對象頭)。在虛擬機中,執行完new指令后會接著執行方法,把對象按照程序員的意愿進行初始化,這樣一個真正可用的對象才算完全產生出來

對象在內存中的布局

對象在內存中的布局如下圖所示,分為對象頭、實例數據、對齊填充[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

淺談Java內存區域劃分和內存分配策略

對象頭(可以參考Java鎖升級)

mark Word, 用于存儲對象自身的運行時數據,如哈希碼、GC分代年齡以及鎖狀態標志等。類型指針,即對象指向它的類元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。

實例數據

對象真正存儲的有效信息,也是程序代碼中所定義的各種類型的字段內容。

對齊填充

并非必然存在,僅僅起著占位符的作用。

對象的訪問定位

Java程序需要通過棧上的reference數據來操作堆上的具體對象。共有兩種策略進行對象的訪問定位

句柄訪問

Java堆中劃分出一塊內存來作為句柄池,reference中存儲的是對象的句柄地址,而句柄中包含了對象實例數據與類型數據各自的具體地址信息,需要兩次尋址。

淺談Java內存區域劃分和內存分配策略

直接指針訪問

Java堆中對象的布局中需要考慮如何放置訪問類型數據的相關信息,而reference中存儲的直接就是對象地址。

淺談Java內存區域劃分和內存分配策略

使用句柄訪問的最大好處就是reference中存儲的是穩定的句柄地址,在對象被移動(垃圾收集時移動對象是非常普遍的行為)時只會改變句柄中實例數據指針,而reference本身不需要修改。

問題

只需要記住一件事,就是Java對象的內存分配均是在堆中進行的。所以對象都存儲在堆中。

但是有人可能會懷疑方法的臨時變量不是存儲在虛擬機棧中嗎?這里我要解釋一下,虛擬機棧維護了一個局部變量表,表中存儲的是對象的引用,而真正存儲對象的地方在堆,如果局部變量都在堆里分配,那么虛擬機棧早爆滿了

同樣類的靜態變量,有人又會懷疑在方法區中存儲。其實不是的,方法區只存儲引用,具體對象是存儲在堆中的,具體實現可以發現,類靜態對象是與class對象一起分配的內存。

參考

深入理解java虛擬機

到此這篇關于淺談Java內存區域劃分和內存分配策略的文章就介紹到這了,更多相關Java內存區域劃分和內存分配內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 久久99国产亚洲高清观看韩国 | 欧美黄色网络 | 美国成人免费视频 | 粉嫩高中生的第一次在线观看 | 欧美一级大片在线观看 | aaa一级特黄 | 免费在线一级毛片 | 理论片免费午夜 | 全免费毛片在线播放 | 中国一级特黄视频 | 国内精品国语自产拍在线观看55 | 欧美日韩一区二区高清视 | 中文精品99久久国产 | 欧美老熟妇bbbb毛片 | 国产精品二区三区免费播放心 | 一区在线免费观看 | 亚欧人成精品免费观看 | 国产高清一区二区三区视频 | 国产日韩在线看 | 99久久国内精品成人免费 | 波多野结衣在线看片 | 欧美做爰免费大片在线观看 | 欧美日韩一日韩一线不卡 | 免费一级毛片正在播放 | 久草视频中文在线 | 日本特级黄毛片毛片视频 | 国产精品久久久久久一区二区 | 久久综合久久精品 | 神马国产 | 久久国产精品久久久久久 | 成人a毛片手机免费播放 | 日本欧美一区二区三区视频 | 久久精品资源 | 久99re视频9在线观看 | 成人午夜视频一区二区国语 | 国产欧美综合一区二区 | 长腿校花被啪到腿软视频 | 国产亚洲一区二区在线观看 | 中文字幕在线看 | 日本aa毛片a级毛片免费观看 | 欧美在线播放成人免费 |