jvm內存結構


內存模型粗略划分為:堆和棧

詳細划分為:堆,棧,本地方法棧,方法區,程序計數器

 

存放對象實例

每創建一個線程,都會為他分配內存空間作為他的棧,當方法執行時,會生成對應的棧幀(局部變量表、操作數棧、動態鏈接、方法出口),每一個方法被調用直至執行完成的過程,就對應着一個棧幀在棧中從入棧到出棧的過程。局部變量表存放了編譯期可知的各種基本數據類型和對象引用

ps:動態鏈接指的是在一個方法中調用另一個方法時,另一個方法的名稱屬於符號引用,將符號引用轉為直接引用稱為動態鏈接

本地方法棧

虛擬機調用本地方法(native關鍵字修飾的)時使用的內存區域

方法區:(方法區是jvm規范的,而在HotSpot虛擬機中,方法區被實現為元空間,他使用的是物理機的本地內存)

常量池,類的數據結構和靜態變量,方法的信息等

程序計數器

為了線程切換后能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,持有一個當前正在被執行的指令的引用。各條線程之間的程序計數器互不影響,屬於“線程私有”。

 

 字符串常量池 String pool 實現為哈希表,存的是字符串對象的引用,真正的對象還是存放在堆中

 

 

 

當在方法實例化一個對象時,關聯的內存有哪些

 

“Object obj”這部分的語義將會反映到虛擬機棧的局部變量表中

new Object()”這部分的語義將會反映到Java堆中,形成一塊存儲了Object 類型所有實例數據值,另外,在Java 堆中還必須包含能查找到此對象類型數據(如對象類型、父類、實現的接口、方法等)的地址信息,這些類型數據則存儲在方法區中

 

 

 

new Object( )  對象實例的對象頭包含了到Class對象的引用,類的元信息都是通過Class對象找到的

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM