{%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`