1. 程式人生 > >深入理解java虛擬機(1)

深入理解java虛擬機(1)

方法區 對象實例 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)