1. 程式人生 > >JVM記憶體模型的簡單瞭解

JVM記憶體模型的簡單瞭解

    瞭解JVM的運作對於Java程式設計師來說是一個知根知底的過程,可以幫助程式設計師寫出高效的程式碼,同時對自己程式碼的運轉有個瞭解,本文我們簡單地介紹下JVM的記憶體模型。

    首先的,我們說說程式計數器,程式計數器的作用其實類似於傳統處理器中的PC,是正在執行的位元組碼的行號指示器,通過改變自身的值,來控制需要選取哪一條位元組碼指令,從而做到分支、跳轉、迴圈、異常處理等基礎操作。為了保證每一次執行緒在獲取CPU的時候程式計數器都能回到原來的位置,所以每一個執行緒都有一個獨立的執行緒計數器,所以該記憶體空間為“執行緒私有”的。

    再就是Java虛擬機器棧,它是Java方法處理的記憶體模型,每一個Java方法被呼叫的時候都會建立一個棧幀,棧幀中儲存著區域性變量表、運算元棧、動態連結、方法出口等內容。其中,區域性變量表中儲存著可預知的基礎資料型別、物件引用、返回地址(指向一條位元組碼指令的地址),而一次方法的執行到返回,就意味著一次入棧和出棧,很顯然,這部分的記憶體也是“執行緒私有”的。

    本地方法棧,大體上和Java棧相同,但是是服務於本地方法(Native)的。

    以上三種記憶體空間都是“執行緒私有”的,以下我們來講述一些“執行緒公有”的記憶體模型,也就是意味著他們隨著虛擬機器的啟動而建立,隨著虛擬機器的關閉而消亡。

    Java堆,幾乎所有的物件例項和陣列都是在該區域建立的,是JVM管理的最大的一塊區域,也是GC活動的核心場所。

    方法區,當JVM使用類裝載器裝載一個類的時候,JVM會先找到指定的位元組碼檔案,再讀入該位元組碼檔案,最後將其資訊加在導方法區記憶體中,最後返回一個class例項。很顯然,該記憶體主要用於存放類的資訊,如類名、類修飾符等,其中方法區中有一片區域,叫做執行時常量池。執行時常量池用於存放欄位、方法資訊、靜態變數。

    上訴五種都是為JVM所管理的記憶體區域,我們再介紹一種比較特殊的記憶體區域,直接記憶體,他是並不是JVM記憶體模型的劃分範圍,他的作用是什麼呢?

    在JDK1.4之後,Java引入了NIO,一種基於通道和緩衝區的IO方式,使用native函式庫直接分配堆外記憶體,如此就無需在Java堆上新建物件作為中間區域呼叫IO了。直接記憶體的讀寫效率是高於堆記憶體的,直接記憶體的申請耗費更高的效能。