1.類加載器(Class Loader):加載類文件到內存。Class loader只管加載,只要符合文件結構就加載,至於能否運行,它不負責,那是有Exectution Engine 負責的。
2.執行引擎(Execution Engine):也叫解釋器,負責解釋命令,交由操作系統執行。
3.本地庫接口(Native Interface):本地接口的作用是融合不同的語言為java所用
4.運行時數據區(Runtime Data Area):
(1)堆。堆是java對象的存儲區域,任何用new字段分配的java對象實例和數組,都被分配在堆上,java堆可用-Xms和-Xmx進行內存控制,jdk1.7以后,運行時常量池從方法區移到了堆上。
新生代:老年代 = 1:2
Eden:s1: s2=8:1:1
(2)方法區:用於存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯后的代碼等數據。
誤區:方法區不等於永生代
很多人原因把方法區稱作“永久代”(Permanent Generation),本質上兩者並不等價,只是HotSpot虛擬機垃圾回收器團隊把GC分代收集擴展到了方法區,或者說是用來永久代來實現方法區而已,這樣能省去專門為方法區編寫內存管理的代碼,但是在Jdk8也移除了“永久代”,使用Native Memory來實現方法區。
(3)虛擬機棧:虛擬機棧中執行每個方法的時候,都會創建一個棧楨用於存儲局部變量表,操作數棧,動態鏈接,方法出口等信息。
(4)本地方法棧:與虛擬機發揮的作用相似,相比於虛擬機棧為Java方法服務,本地方法棧為虛擬機使用的Native方法服務,執行每個本地方法的時候,都會創建一個棧幀用於存儲局部變量表,操作數棧,動態鏈接,方法出口等信息。
(5)程序計數器。指示Java虛擬機下一條需要執行的字節碼指令。
線程私有的: 程序計數器 虛擬機棧 本地方法棧