程序計數(shù)器
????程序計數(shù)器是一塊較小的內(nèi)存空間,它可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器氨肌。每條線程都需要一個獨立的程序計數(shù)器鸿秆,且互不影響,獨立存儲怎囚。此內(nèi)存區(qū)域是唯一一個在Java虛擬機(jī)規(guī)范中沒有規(guī)定OutOfMemoryError情況的區(qū)域卿叽。
Java虛擬機(jī)棧
?????Java虛擬機(jī)棧也是線程私有的,生命周期同線程恳守,描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀考婴,用于存儲局部變量表、操作數(shù)棧催烘、動態(tài)鏈接蕉扮、方法出口等信息。
? ? 局部變量表存放了編譯期可知的各種基本數(shù)據(jù)類型(boolean颗圣、byte喳钟、char、short在岂、int奔则、float、long蔽午、double)易茬、對象飲用(reference類型,可能是指向一個對象起始地址的引用指針及老,也可能是指向一個代表對象的句柄)和returnAddress類型(指向了一條字節(jié)碼指令的地址)抽莱。
? ? long和double類型的數(shù)據(jù)會占用2個局部變量空間(slot),其余的只占1個骄恶。局部變量空間在編譯期已經(jīng)確定食铐,在方法運行期間不會改變。
本地方法棧
? ? 本地方法棧的作用和虛擬機(jī)棧類似僧鲁,只不過虛擬機(jī)棧為Java方法(字節(jié)碼)服務(wù)虐呻,而本地方法棧為虛擬機(jī)使用的native方法服務(wù)。
Java堆
? ? Java堆是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊寞秃,是所有線程共享的內(nèi)存區(qū)域斟叼,在虛擬機(jī)啟動時創(chuàng)建,幾乎所有的對象實例都在這里分配內(nèi)存春寿,既可以是固定大小的朗涩,也可以是可擴(kuò)展的。
方法區(qū)
? ? 方法區(qū)也是所有線程共享的內(nèi)存區(qū)域绑改,用于存儲已被虛擬機(jī)加載的類信息谢床、常量兄一、靜態(tài)變量、即時編譯器編譯的代碼等信息萤悴,可選擇固定大小和可擴(kuò)展,還可以選擇不實現(xiàn)垃圾收集皆的。
? ? 運行時常量池是方法區(qū)的一部分覆履,Class文件中除了類的版本、字段费薄、方法硝全、接口等描述信息外,還有常量池楞抡,存放編譯期生成的各種字面量和符號引用伟众。
????運行時常量池具有動態(tài)性,運行期間也可以將新的常量加入到常量池中召廷。
直接內(nèi)存
? ? 直接內(nèi)存不是虛擬機(jī)運行時數(shù)據(jù)區(qū)的一部分凳厢,也不是Java虛擬機(jī)規(guī)范的內(nèi)存區(qū)域。但這部分內(nèi)存也被頻繁使用竞慢。直接內(nèi)存的分配不受Java堆大小的限制先紫,但是會受到本機(jī)最大內(nèi)存的限制。也會出現(xiàn)OutOfMemoryError異常情況筹煮。