1. 程式人生 > >JVM中的記憶體型別(資料區域)

JVM中的記憶體型別(資料區域)

Java一詞狹義上指的是Java程式語言,廣義上來說還包括Java平臺。Java虛擬機器作為一個平臺來執行由Java原始碼編譯成的.class檔案,Java的跨平臺性也是通過JVM來實現的。

JVM之所以稱之為虛擬機器,就是因為JVM就像是執行在底層物理機上面的一臺虛擬機器,它的各個部分互相配合,完成了一個Java應用程式的執行。本文就簡單地對JVM執行過程中的各個資料區域做一個介紹。

JVM這個詞語狹義上指的是一種規範,不特指某一種具體的實現,最常見的實現是Oracle的HotSpot,這裡是一份所有JVM實現的列表。但是我們說JVM時也可以指HotSpot,本文是在參考Java SE 8的JVM說明和HotSpot的文件的基礎上寫的,哪些屬於JVM說明,哪些屬於HotSpot實現,我會在文中做出說明。

下圖來自Oracle官網上一篇名為Java Garbage Collection Basics的文章。但是也有點問題,先貼上來,我會進行一些說明。 在這裡插入圖片描述Runtime Data Areas從左往右看, 第一個是Method Area,這是JVM中的叫法,在HotSpot的Java SE 7版本中應該叫Permanent Generation,在HotSpot的Java SE 8版本中,取消了Permanent Generation,取而代之的是Metaspace,每個JVM程序中只有一個Method Area。Java應用程式執行時類載入器會尋找需要的類,找到後把.class檔案載入到Method Area

裡面,.class檔案包含jvm指令(也就是位元組碼)和一個常量池表(constant_pool table)以及其他輔助資訊。我們寫程式碼時定義了類,裡面定義了這個類可以做的事情,.java檔案被編譯為.class檔案後被載入到Method Area裡面,Method Area裡面的東西可以告訴JVM,它應該做什麼以及怎麼做。 每個JVM程序只有一塊HeapHeap裡面放著物件,在類被載入到Method Area裡面後,會在Heap中建立相應的Class型別的物件,對於某一個類,不管在Heap中它有多少個物件,Heap中它對應的Class型別的物件始終都只有一個。Heap中的物件中只包含它的類中的域,類中的方法還是在Method Area中,有一個int域和一個方法的類的物件在Heap
中佔的記憶體大小和有一個int域十個方法的類的物件在Heap中佔的記憶體大小一樣。 Java Thread指的是Java應用程式執行時Java中的方法執行的棧,在JVM說明中叫Java Virtual Machine Stacks,每個執行緒有一個私有棧,棧中儲存著Java方法的本地變數和中間結果,也承擔著方法呼叫和方法返回的任務,通過棧幀(Frame)的壓入和彈出實現。 每個Java執行緒有自己的Program Counter Register,在任意時刻,一個Java執行緒總是在執行某個方法的code,如果這個方法是Java中的(還有計算機平臺中的本地方法),那麼pc register中就是執行的方法對應的Java執行的地址,如果那個方法是本地方法,pc register中的值就是未定義的。 Native Internal Threads指的是本地方法棧,有些Java應用程式要用到本地的一些方法,例如在控制檯的列印和輸入,本地方法的執行單獨在本地方法棧裡面。