下面是我閱讀JVM規(guī)范的筆記肃廓。
1.單個線程的數(shù)據(jù)區(qū)(不共享)
每個單獨的線程的數(shù)據(jù)區(qū)都包括程序計數(shù)器(Program Counter Register)呕乎,虛擬機棧(Java Virtual Machine Stacks)核行,本地方法棧(Native Method Stack)庆杜。當(dāng)一個新線程被創(chuàng)建時叁幢,這些數(shù)據(jù)區(qū)會被一同創(chuàng)建饵沧。
程序計數(shù)器(Program Counter Register)被用來控制每個線程的執(zhí)行巧娱,記錄每個線程執(zhí)行到哪了。
虛擬機棧(Java Virtual Machine Stacks)包含了棧幀逾滥,下面會給出視圖峰档。
本地方法棧(Native Method Stack)用來支持native方法,非java語言的方法寨昙。
2.所有線程共享的數(shù)據(jù)區(qū)
所有線程共享堆和方法區(qū)
堆(Heap)是我們最頻繁處理的數(shù)據(jù)區(qū)讥巡。它儲存了數(shù)組和對象。當(dāng)虛擬機啟動時就會創(chuàng)建這塊數(shù)據(jù)區(qū)舔哪。垃圾回收GC主要在堆中工作欢顷。
方法區(qū)(Method Area):它存儲的是已被虛擬機加載的類信息、常量(從JDK7開始已經(jīng)移至堆內(nèi)存中)捉蚤、靜態(tài)變量等數(shù)據(jù)抬驴。
運行時常量池(Runtime Constant Pool):每一個類或者接口,在其編譯后生成的 .class文件中,有一個部分叫做 常量表(constant_pool_table),JVM將class文件加載以后,就解析常量表的內(nèi)容到運行時常量池。
棧包含了若干個棧幀缆巧,當(dāng)一個方法被調(diào)用時布持,一個棧幀就會被推入棧中。一個棧幀包含了局部變量數(shù)組(Local Variable Array)陕悬,操作數(shù)棧( Operand Stack)鳖链,常量池引用(Reference to Constant Pool)三部分。
有關(guān)更多信息墩莫,請到JVM規(guī)范官網(wǎng)芙委。