Java虛擬機進階之二:運行時數據區內存劃分
目標:
1, 瞭解內存是劃分爲哪五部分的?
2, 每一部分具體是做什麼的。
Note: 本部分的內容信息容量較大,細節較多。文章將從淺到深來介紹。
第一部分:各數據區線程共享/線程獨立情況
線程共享:
方法區(Method Area),堆(heap)
線程獨立:
虛擬機棧(Java VM Stack)本地方法棧(Native Stack)程序計數器(Program Counter Register)
第二部分:各數據區功能
方法區:存儲已被虛擬機加載的類的信息,常量,靜態變量,及時編譯後的代碼
堆:存放對象實例
虛擬機棧:方法執行的內存模型,創建棧幀,存儲變量及方法出口
本地方法棧:執行Native方法的內存模型
程序計數器:虛擬機多線程切換,記錄當前程序所執行的字節碼的行號
第三部分:更多的細節
請仔細研讀第三部分,這部分涉及到深入的內容,可以參考Java Vm Specification
可以點擊圖片放大。
For More Details:
1, String intern()
2,常量池(Constant Pool Table) vs 運行時常量池(Runtime Constant Pool)
根據官方文檔:
運行時常量池(Runtime Constant Pool)是每一個類或接口的常量池(Constant_Pool,
§4.4)的運行時表示形式,它包括了若干種不同的常量:從編譯期可知的數值字面量到必須運行
期解析後才能獲得的方法或字段引用。運行時常量池扮演了類似傳統語言中符號表(Symbol
Table)的角色,不過它存儲數據範圍比通常意義上的符號表要更爲廣泛。