JAVA的內存是如何劃分的?

一種說法是分為: 堆(Heap),棧(Stacks)方法區(MethodArea),運行時常量池(RuntimeConstant Pool),本地方法棧(NativeMethod Stacks),PC Register(PC寄存器)。

另一種說法是分為:堆(Heap),棧(Stacks),數據段(data segment),代碼段(code segment)。

這兩種說法之間有什麼關係嗎?


同一個事物的多面性。

題主所說的:

一種說法是分為: 堆(Heap),棧(Stacks)方法區(MethodArea),運行時常量池(RuntimeConstant Pool),本地方法棧(NativeMethod Stacks),PC Register(PC寄存器)。

是從抽象的JVM的角度去看的。相關定義請參考JVM規範:Chapter 2. The Structure of the Java Virtual Machine

然後題主所說的:

另一種說法是分為:堆(Heap),棧(Stacks),數據段(data segment),代碼段(code segment)。

則是從操作系統上的進程的角度去看的。相關定義請參考各種操作系統的資料,例如Linux的話可以參考這個簡單的介紹:Linux Processes explained

然後兩者是如何結合起來的呢?

如果只看常見的桌面/伺服器端Java的使用方式的話,其實Java應用程序從操作系統的角度來看也是普通的進程而已。所以所有普通進程該有的東西它都有。

我幾年前做一個內部培訓的時候做過一組幻燈片講解兩者的對應關係,不過當時有點趕工所以做得不是特別完整,就不發出來了。

當時做的一個例子倒是可以發出來給大家感受一下JVM層面的概念與操作系統層面概念在實際應用中的映射:

https://gist.github.com/rednaxelafx/2139774 &<- 主要是在pmap的輸出後面結合Java層面的信息添加了一些註解。

https://gist.github.com/rednaxelafx/2138106


詳見《深入理解Java虛擬機 JVM高級特性與最佳實踐》周志明 著

註:截圖出自此書第二章:Java內存區域與內存溢出異常。


java內存主要分為堆,程序計數器,虛擬機棧,方法棧,方法區,常量存儲區,本地方法區。其中堆和常量存儲區是屬於所有線程公用的。

堆上面分配對象,一個對象包括對象頭和具體的實例內容,其中對象頭會有類型信息。

那麼java是怎麼定位到具體的對象信息的呢,原來還有一個直接存儲區。這個裡面有兩種方法來定位。第一就是在棧裡面存放對象的 句柄,每個句柄存放對象的地址,第二就是在棧裡面直接存放對象的地址信息。

對,樓上說的對,看一下深入理解jvm,應該能夠找到你要的答案


可以看看 Java虛擬機規範 還有深入理解虛擬機


1699 777 65 java江湖http://www.javajh.com


推薦閱讀:

網站搭建具體步驟?
if (常量 == 變數) 的寫法好還是不好?
哪位大神給解讀一下jdk裡面Map中put方法的一段源代碼?
剛畢業的程序員,如何快速提升實力?
成為網工還是程序員,迷茫?

TAG:Java | 程序 | Java虛擬機JVM |