天天看點

JVM(一)—Java記憶體模型

JVM(一)—Java記憶體模型

Java虛拟機記憶體包括如下幾個運作時資料區域:

JVM(一)—Java記憶體模型
  • 程式計數器
  • 虛拟機棧
  • 本地方法棧
  • 方法區

1 程式計數器—線程私有

程式計數器是目前線程執行的位元組碼的行号訓示器。 

程式計數器占用一塊較小的記憶體,線程私有。

為什麼需要 程式計數器? 

因為Java虛拟機的多線程是通過線程切換獲得CPU執行時間來執行的。每個處理器隻會處理一條線程,為了處理器切換線程時能回到之前所執行的位置,每個線程都要有一個 程式計數器,記錄目前線程執行的位元組碼的位置。是以是線程私有的。

2 Java虛拟機棧—線程私有

虛拟機棧主要存放局部變量表,操作數棧,動态連結和方法出口等資訊。其中局部變量表主要是基本資料類型和對象的引用。

1)運作執行時情況 

每個方法在執行時,都會建立一個棧幀用于存儲局部變量表,操作數棧,動态連結和方法出口等資訊。每一個方法從調用到執行完成的過程,就對應着一個棧幀在Java虛拟機棧中入棧到出棧的過程。

2)兩種異常 

StackOverflowError:線程申請的棧記憶體過大; 

OutofMemoryError:棧記憶體不夠時。

3 本地方法棧—線程私有

本地方法棧中存儲的是本地方法Native方法的資訊。

4 Java堆—線程共享

主要用來存放對象執行個體和數組。 

也是垃圾收集器管理的主要區域。

5 方法區—線程共享

用于存儲被虛拟機加載的類資訊、常量、靜态變量、即時編譯後的代碼等資料。

繼續閱讀