---
# System prepended metadata

title: JAVA JVM 記憶體結構
tags: [學習筆記, JAVA, JVM]

---

{%hackmd BJrTq20hE %}
# JAVA JVM 記憶體結構

<summary>JVM的記憶體結構</summary>

![](https://i.imgur.com/htu0c9w.jpg)


## **classloader 與 execution engine(<font color="#dd0000">紅框</font>)**

> classloader為input端，負責將硬碟上的class檔讀進到Runtime data area；execution engine為output端，負責將運算指令交給作業系統，由作業系統調度硬體進行運算，最終再將結果回傳到Runtime data area。

## **Stack Area 與 PC Registers(<font color="#dddd00">黃框</font>)**

> Stack Area每一條執行緒有自己的 stack，用來記錄method被調用的先後順序，由main thread開始；而thread其stack的『出入點』則是由 PC Registers 來記錄。常見的錯誤有 StackOverFlowError，為無窮迴圈或遞迴狀態下讓Register爆掉所產生。

## **Native Method Stack 與 Native Method Interface 與 Native Method Library(<font color="#00dd00">綠框</font>)**

> Native Method Stack 存放(登記)非java方法的調用，讓execution engine可以藉由JNI來調用第3方dll(動態連結庫)來完成互動，進而得出結果，因此，也可以說JNI是為了JAVA能調用其它編程語言而產生的介面。


## **Method area 與 heap area(<font color="#0000dd">藍框</font>)**

> class檔被讀入後，其 static 屬性/方法/建構子將存入 method area備用，建立物件時它們會被調用。當object被創建出來，將被存放至heap area，heap area中的物件不再被stack當成參考時，那麼它將逃不過下一次的gc。當此區爆掉時會產生Out of memory的錯誤。





###### tags: `學習筆記` `JAVA` `JVM`