
內存模型粗略划分為:堆和棧
詳細划分為:堆,棧,本地方法棧,方法區,程序計數器
堆:
存放對象實例
棧:
每創建一個線程,都會為他分配內存空間作為他的棧,當方法執行時,會生成對應的棧幀(局部變量表、操作數棧、動態鏈接、方法出口),每一個方法被調用直至執行完成的過程,就對應着一個棧幀在棧中從入棧到出棧的過程。局部變量表存放了編譯期可知的各種基本數據類型和對象引用
ps:動態鏈接指的是在一個方法中調用另一個方法時,另一個方法的名稱屬於符號引用,將符號引用轉為直接引用稱為動態鏈接
本地方法棧:
虛擬機調用本地方法(native關鍵字修飾的)時使用的內存區域
方法區:(方法區是jvm規范的,而在HotSpot虛擬機中,方法區被實現為元空間,他使用的是物理機的本地內存)
常量池,類的數據結構和靜態變量,方法的信息等
程序計數器:
為了線程切換后能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,持有一個當前正在被執行的指令的引用。各條線程之間的程序計數器互不影響,屬於“線程私有”。
字符串常量池 String pool 實現為哈希表,存的是字符串對象的引用,真正的對象還是存放在堆中
當在方法實例化一個對象時,關聯的內存有哪些

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

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