JVM記憶體中各部分存放的內容
阿新 • • 發佈:2019-01-03
虛擬機器記憶體中主要有程式計數器、虛擬機器棧、本地方法棧、堆和方法區。
程式計數器和虛擬機器棧都是執行緒“私有”的記憶體。
程式計數器是一塊比較下的記憶體空間,主要村放程式碼執行的位置。分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要一來這個計數器來完成。
例如,多執行緒中,為了執行緒切換後能恢復到正確的執行位置,每條執行緒都需要有一個獨立的程式計數器,他們之間互不影響,獨立儲存。
虛擬機器棧中存放了各種基本資料型別和物件引用。比如int i。這時候機會在棧中分配一個int型別的記憶體給i,並初始化為零值。本地方法棧和虛擬機器棧所發揮的作用是非常相似的,他們之間的區別不過是虛擬機器棧為虛擬機器執行java方法服務,而本地方法棧則為虛擬機器使用到的Native方法服務。
堆和方法區是各個執行緒共享的記憶體區域
堆(Java Heap)是虛擬機器所管理的記憶體中最大的一塊,在虛擬機器啟動時建立。此記憶體區域的唯一目的就是存放物件例項,幾乎所有的物件例項都在這裡分配記憶體,但是隨著JIT編譯器的發展和逃逸分析技術逐漸成熟,棧上分配、標量替換優化技術將會導致一些微妙的變化發生,所有的物件都分配在堆上就變得不是那麼絕對了。
方法區用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。
執行時常量池是方法區的一部分,用於存放編譯器生成的各種字面量和符號引用。