深入理解java虛擬機(1)
阿新 • • 發佈:2019-01-22
方法區 對象實例 nat 物理 深入 ret 字符 java 所有
java內存區域
Java虛擬機執行java程序時會將管理的內存劃分為若幹個區域:
1. 程序計數器
程序計數器是一個”線程私有“的內存區域,用於獲取下一條需要執行的字節碼指令,如分支、循環、跳轉等。
2. Java虛擬棧
在Java內存劃分的時候,經常會聽到將其分為”堆內存“和”棧內存“,這種分法中的”棧內存“就是指Java虛擬棧,更具體點就是Java虛擬棧中的局部變量表部分。——局部變量表存放的是java基本數據類型(如boolean、int等)、對象引用(reference類型,可能是對象起始地址的引用指針、代表對象的句柄或者其他與此對象相關的位置)和returnAddress類型(指向一條字節碼指令的地址)。
Java虛擬棧同樣也是”線程私有“的內存區域,各個線程互不影響。
3. 本地方法棧
該區域與虛擬機棧所發揮的作用非常相似,只是虛擬機棧為虛擬機執行Java方法服務,而本地方法棧則為使用到的本地操作系統(Native)方法服務。
4. Java堆
Java堆是虛擬機管理的內存中最大的一塊,它是被所有線程共享的一塊區域,用於存放對象實例,是GC回收的主要區域。
Java堆可以是物理上不連續的內存空間,只要邏輯是連續的即可。
5. 方法區
方法區也是各個線程共享的內存區域,用於存放被虛擬機加載的類信息、常量、靜態變量、及時編譯器編譯後的代碼等數據。——在jdk1.7之後,字符串常量重新被移到了堆中。
6. 運行時常量池
運行時常量池屬於方法區的一部分,用於存放編譯期生成的各種字面量和符號引用。——常量不一定只有運行時才會產生,運行期間也可以放入新的常量,例如String.intern()方法。
深入理解java虛擬機(1)