电竞比分网-中国电竞赛事及体育赛事平台

分享

Java虛擬機(jī)深入研究_3

 linyu2688 2006-09-08

  Java虛擬機(jī)的運(yùn)行過(guò)程

  上面對(duì)虛擬機(jī)的各個(gè)部分進(jìn)行了比較詳細(xì)的說(shuō)明,下面通過(guò)一個(gè)具體的例子來(lái)分析它的運(yùn)行過(guò)程。

  虛擬機(jī)通過(guò)調(diào)用某個(gè)指定類(lèi)的方法main啟動(dòng),傳遞給main一個(gè)字符串?dāng)?shù)組參數(shù),使指定的類(lèi)被裝載,同時(shí)鏈接該類(lèi)所使用的其它的類(lèi)型,并且初始化它們。例如對(duì)于程序:

class HelloApp
{
 public static void main(String[] args)
 {
  System.out.println("Hello World!");
  for (int i = 0; i < args.length; i++ )
  {
   System.out.println(args[i]);
  }
 }
}

  編譯后在命令行模式下鍵入: java HelloApp run virtual machine

  將通過(guò)調(diào)用HelloApp的方法main來(lái)啟動(dòng)java虛擬機(jī),傳遞給main一個(gè)包含三個(gè)字符串"run"、"virtual"、"machine"的數(shù)組。現(xiàn)在我們略述虛擬機(jī)在執(zhí)行HelloApp時(shí)可能采取的步驟。

  開(kāi)始試圖執(zhí)行類(lèi)HelloApp的main方法,發(fā)現(xiàn)該類(lèi)并沒(méi)有被裝載,也就是說(shuō)虛擬機(jī)當(dāng)前不包含該類(lèi)的二進(jìn)制代表,于是虛擬機(jī)使用ClassLoader試圖尋找這樣的二進(jìn)制代表。如果這個(gè)進(jìn)程失敗,則拋出一個(gè)異常。類(lèi)被裝載后同時(shí)在main方法被調(diào)用之前,必須對(duì)類(lèi)HelloApp與其它類(lèi)型進(jìn)行鏈接然后初始化。鏈接包含三個(gè)階段:檢驗(yàn),準(zhǔn)備和解析。檢驗(yàn)檢查被裝載的主類(lèi)的符號(hào)和語(yǔ)義,準(zhǔn)備則創(chuàng)建類(lèi)或接口的靜態(tài)域以及把這些域初始化為標(biāo)準(zhǔn)的默認(rèn)值,解析負(fù)責(zé)檢查主類(lèi)對(duì)其它類(lèi)或接口的符號(hào)引用,在這一步它是可選的。類(lèi)的初始化是對(duì)類(lèi)中聲明的靜態(tài)初始化函數(shù)和靜態(tài)域的初始化構(gòu)造方法的執(zhí)行。一個(gè)類(lèi)在初始化之前它的父類(lèi)必須被初始化。整個(gè)過(guò)程如下:


圖4:虛擬機(jī)的運(yùn)行過(guò)程
  結(jié)束語(yǔ)

  本文通過(guò)對(duì)JVM的體系結(jié)構(gòu)的深入研究以及一個(gè)Java程序執(zhí)行時(shí)虛擬機(jī)的運(yùn)行過(guò)程的詳細(xì)分析,意在剖析清楚Java虛擬機(jī)的機(jī)理。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多