深入理解java虛擬機器學習筆記(一)
阿新 • • 發佈:2018-12-10
Java記憶體區域模型
Java虛擬機器在執行Java程式的過程中,會把它所管理的記憶體區域劃分為若干個不同的資料區域,這些區域一般被稱為執行時資料區(Runtime Data Area),也就是我們常說的JVM記憶體。
執行時資料區通常包括以下這幾個部分:
- 程式計數器(Program Counter Register)
- 虛擬機器棧(VM Stack)
- 本地方法棧(Native Method Stack)
- 堆(Heap)
- 方法區(Method Area)
1. 程式計數器(Program Counter Register)
程式計數器是一塊較小的記憶體空間,它可以看做是當前執行緒所執行的位元組碼的行號指示器。位元組碼直譯器在工作時,會通過改變這個計數器的值來取下一條語句指令。每條執行緒都需要一個獨立的程式計數器,各條執行緒之間計數器互不影響,獨立儲存,我們稱之為執行緒私有
2.虛擬機器棧(VM Stack)
虛擬機器棧描述的是Java方法執行的記憶體模型:每個方法在執行的同時都會建立一個棧幀用於儲存區域性變量表、運算元棧、動態連結、方法出口等資訊。每一個方法從呼叫直至執行完成的過程,就對應著一個棧幀在虛擬機器棧中從入棧到出棧的過程。與程式計數器一樣,虛擬機器棧也是執行緒私有的,它的生命週期與執行緒相同
3.本地方法棧(Native Method Stack)
本地方法棧的作用與虛擬機器棧非常的類似,它們的主要區別是:虛擬機器棧是執行Java方法的,而本地方法棧是用來執行native方法的。與虛擬機器棧一樣,本地方法棧也是執行緒私有的
4.堆(Heap)
Java堆是被所有執行緒所共享的一塊記憶體區域,在虛擬機器啟動時建立。此記憶體區域的唯一目的就是存放物件例項
5.方法區(Method Area)
方法區與Java堆一樣,是各個執行緒共享的記憶體區域,它用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即使編譯器編譯後的程式碼等資料
執行時常量池(Runtime Constant Pool)是方法區的一部分,用於儲存編譯期生成的各種字面量、符號引用,這部分內容將在類載入後進入方法區的執行時常量池中存放