JVM基本構成:
從上圖可知,JVM主要包括四個部分:
1.類加載器(ClassLoader)
在JVM啟動時或者在類運行時將需要的class加載到JVM中猎贴。(下圖表示了從java源文件到JVM的整個過程班缎,可配合理解蝴光。
2.執(zhí)行引擎
負責執(zhí)行class文件中包含的字節(jié)碼指令;
3.內存區(qū)(也叫運行時數(shù)據(jù)區(qū))
是在JVM運行的時候操作所分配的內存區(qū)达址。運行時內存區(qū)主要可以劃分為5個區(qū)域蔑祟,如圖:
方法區(qū)(Method Area):用于存儲類結構信息的地方,包括常量池沉唠、靜態(tài)變量疆虚、構造函數(shù)等。雖然JVM規(guī)范把方法區(qū)描述為堆的一個邏輯部分满葛, 但它卻有個別名non-heap(非堆)径簿,所以大家不要搞混淆了。方法區(qū)還包含一個運行時常量池嘀韧。
java堆(Heap):存儲java實例或者對象的地方篇亭。這塊是GC的主要區(qū)域。從存儲的內容我們可以很容易知道锄贷,方法區(qū)和堆是被所有java線程共享的译蒂。
java棧(Stack):java棧總是和線程關聯(lián)在一起谊却,每當創(chuàng)建一個線程時柔昼,JVM就會為這個線程創(chuàng)建一個對應的java棧。在這個java棧中又會包含多個棧幀炎辨,每運行一個方法就創(chuàng)建一個棧幀捕透,用于存儲局部變量表、操作棧蹦魔、方法返回值等激率。每一個方法從調用直至執(zhí)行完成的過程,就對應一個棧幀在java棧中入棧到出棧的過程勿决。所以java棧是現(xiàn)成私有的乒躺。
程序計數(shù)器(PC Register):用于保存當前線程執(zhí)行的內存地址。由于JVM程序是多線程執(zhí)行的(線程輪流切換)低缩,所以為了保證線程切換回來后嘉冒,還能恢復到原先狀態(tài),就需要一個獨立的計數(shù)器咆繁,記錄之前中斷的地方讳推,可見程序計數(shù)器也是線程私有的。
本地方法棧(Native Method Stack):和java棧的作用差不多玩般,只不過是為JVM使用到的native方法服務的银觅。
4.本地方法接口
主要是調用C或C++實現(xiàn)的本地方法及返回結果。