一 jvm運(yùn)行原理
1.JVM是可運(yùn)行java代碼的假想計(jì)算機(jī),包括一套字節(jié)碼指令集,一組寄存器,一個(gè)棧,一個(gè)垃圾回收,堆,和一個(gè)存儲(chǔ)方法域。
2.在虛擬機(jī)上是無(wú)法直接運(yùn)行.java文件,因?yàn)樘摂M機(jī)不能識(shí)別.java文件。在虛擬機(jī)運(yùn)行之前需要先將.java文件用編譯器生成.class文件,即生成字節(jié)碼文件。.class是可以被虛擬機(jī)識(shí)別并運(yùn)行的。所以虛擬機(jī)運(yùn)行的是編譯器生成的.class文件,而不是.java文件本身。

二 jvm的內(nèi)存結(jié)構(gòu)
根據(jù)jvm規(guī)范,可以將jvm的內(nèi)存分為六個(gè)區(qū)域:
PC寄存器(即程序計(jì)數(shù)器),方法區(qū),堆區(qū),虛擬機(jī)棧,本地方法棧,常量池
2.1 程序寄存器
即PC寄存器,是一個(gè)很小的內(nèi)存區(qū)域。用來(lái)存儲(chǔ)字節(jié)碼行號(hào),程序的推進(jìn)就是通過(guò)更改程序計(jì)數(shù)器的的值讀取下一條要執(zhí)行的指令。
2.2方法區(qū)
存放了要加載的類,靜態(tài)變量,構(gòu)造函數(shù),final定義的常量,類中的方法和字段等信息。GC也會(huì)在此執(zhí)行,只是很少。超出內(nèi)存時(shí)會(huì)拋出異常。
2.3堆區(qū)
Gc最頻繁的區(qū)域,堆區(qū)由所有線程共享,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。主要存放對(duì)象實(shí)例及數(shù)組,以及所有new出來(lái)的對(duì)象。
2.4虛擬機(jī)棧
占用的是操作系統(tǒng)的內(nèi)存,每個(gè)線程對(duì)應(yīng)一個(gè)虛擬機(jī)棧,它是線程私有的,隨著線程的創(chuàng)建而創(chuàng)建,隨著線程的消失而消失,用來(lái)存放局部變量,動(dòng)態(tài)鏈接,操作數(shù)和方法出口信息等等。
2.5本地方法棧
用于支持native方法的執(zhí)行,與虛擬機(jī)棧的機(jī)制一致。唯一的區(qū)別是虛擬機(jī)棧執(zhí)行java方法本地方法棧執(zhí)行native方法。
2.6常量池
常量池在java用于保存在編譯期已確定的,已編譯的class文件中的一份數(shù)據(jù)。它包括了關(guān)于類,方法,接口等中的常量,也包括字符串常量,如String s = "java"這種申明方式;當(dāng)然也可擴(kuò)充,執(zhí)行器產(chǎn)生的常量也會(huì)放入常量池,故認(rèn)為常量池是JVM的一塊特殊的內(nèi)存空間。
三 Gc機(jī)制(垃圾回收機(jī)制)
隨著程序的運(yùn)行,內(nèi)存中的實(shí)例對(duì)象及變量等占據(jù)的內(nèi)存越來(lái)越多。如果不及時(shí)進(jìn)行回收,將使得程序運(yùn)行的幾率底下甚至系統(tǒng)的異常。在上述的五個(gè)區(qū)域中,程序計(jì)數(shù)器和虛擬機(jī)棧以及本地方法棧隨著程序的生命周期自動(dòng)銷毀,堆區(qū)以及方法區(qū)需要對(duì)那些不存在任何引用的對(duì)象,變量等等垃圾進(jìn)行處理。