前言
在學(xué)習(xí)java基礎(chǔ)的時候牵署,我們需要了解java虛擬機是怎樣運行的豺总,下面我將簡單介紹一下隔显。希望能夠幫助到你项鬼。
首先了解五種內(nèi)存模型
JVM.png
- 程序計數(shù)器(線程私有):保存當(dāng)前線程所執(zhí)行字節(jié)碼的位置,每個線程工作時耻陕,都有一個獨立的計數(shù)器拙徽,程序計數(shù)器只為執(zhí)行java程序服務(wù),執(zhí)行native方法時诗宣,程序計數(shù)器為空膘怕。
- Java虛擬機棧(線程私有):線程在執(zhí)行每個方法時,都會創(chuàng)建一個棧陣梧田,用來存儲局部變量表淳蔼,操作棧侧蘸、動態(tài)鏈接裁眯,方法出口等信息鹉梨,調(diào)用方法時執(zhí)行入棧,方法返回時執(zhí)行出棧穿稳。
- 本地方法棧(線程私有):同樣也是用來保存線程執(zhí)行方法時的信息存皂,不同的是,執(zhí)行java方法時逢艘,使用棧旦袋,執(zhí)行native方法時,使用本地方法棧它改。
- 堆(線程共享):是JVM管理中最大的一塊疤孕。堆被所有的線程共享,目的是為了存放對象的實例央拖。幾乎所有的對象實例都會放在這里祭阀。當(dāng)堆內(nèi)存沒有可用的空間時,會拋出OOM異常(out of memory的簡稱鲜戒,稱之為內(nèi)存溢出)专控。
- 方法區(qū)(線程共享):也是各個內(nèi)存共享的區(qū)域,又叫非堆區(qū)遏餐,用于存儲已被虛擬機加載的類信息伦腐、常量、靜態(tài)常量失都。
它們分別用來存儲哪些信息
- 程序計數(shù)器(線程私有):虛擬機字節(jié)碼指令的地址或Undefind柏蘑。
- Java虛擬機棧(線程私有):java方法(局部變量表、操作數(shù)棧粹庞、動態(tài)鏈接咳焚、方法出口)。
- 本地方法棧(線程私有):Native方法信粮。
- 堆(線程共享):對象實例和數(shù)組黔攒。
- 方法區(qū)(線程共享):類信息(屬性、方法)强缘、常量督惰、靜態(tài)變量、即時編譯器編譯后的代碼旅掂,如static赏胚、class。