資源描述:
《《JVM學(xué)習(xí)筆記》PPT課件》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、JVM學(xué)習(xí)筆記(一)------基本結(jié)構(gòu)從Java平臺(tái)的邏輯結(jié)構(gòu)上來看,我們可以從下圖來了解JVM:從下圖能清晰看到Java平臺(tái)包含的各個(gè)邏輯模塊,也能了解到JDK與JRE的區(qū)別:對(duì)于JVM自身的物理結(jié)構(gòu),我們可以從下圖鳥瞰一下:對(duì)于JVM的學(xué)習(xí),在我看來這么幾個(gè)部分最重要:Java代碼編譯和執(zhí)行的整個(gè)過程JVM內(nèi)存管理及垃圾回收機(jī)制下面將這兩個(gè)部分進(jìn)行詳細(xì)學(xué)習(xí)JVM學(xué)習(xí)筆記(二)------Java代碼編譯和執(zhí)行的整個(gè)過程Java代碼編譯是由Java源碼編譯器來完成,流程圖如下所示:Java字節(jié)碼的執(zhí)行是由JVM執(zhí)行引擎來完成,流程圖如下所示:Java代碼編譯和執(zhí)行的整個(gè)過程包含了以下三個(gè)
2、重要的機(jī)制:Java源碼編譯機(jī)制類加載機(jī)制類執(zhí)行機(jī)制Java源碼編譯機(jī)制Java源碼編譯由以下三個(gè)過程組成:分析和輸入到符號(hào)表注解處理語義分析和生成class文件流程圖如下所示:最后生成的class文件由以下部分組成:結(jié)構(gòu)信息。包括class文件格式版本號(hào)及各部分的數(shù)量與大小的信息元數(shù)據(jù)。對(duì)應(yīng)于Java源碼中聲明與常量的信息。包含類/繼承的超類/實(shí)現(xiàn)的接口的聲明信息、域與方法聲明信息和常量池方法信息。對(duì)應(yīng)Java源碼中語句和表達(dá)式對(duì)應(yīng)的信息。包含字節(jié)碼、異常處理器表、求值棧與局部變量區(qū)大小、求值棧的類型記錄、調(diào)試符號(hào)信息類加載機(jī)制JVM的類加載是通過ClassLoader及其子類來完成的,類
3、的層次關(guān)系和加載順序可以由下圖來描述:1)BootstrapClassLoader負(fù)責(zé)加載$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++實(shí)現(xiàn),不是ClassLoader子類。2)ExtensionClassLoader負(fù)責(zé)加載java平臺(tái)中擴(kuò)展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包。3)AppClassLoader負(fù)責(zé)記載classpath中指定的jar包及目錄中class。4)CustomClassLoader屬于應(yīng)用程序根據(jù)自身需要自定義的ClassLoader,如tom
4、cat、jboss都會(huì)根據(jù)j2ee規(guī)范自行實(shí)現(xiàn)ClassLoader。加載過程中會(huì)先檢查類是否被已加載,檢查順序是自底向上,從CustomClassLoader到BootStrapClassLoader逐層檢查,只要某個(gè)classloader已加載就視為已加載此類,保證此類只所有ClassLoader加載一次。而加載的順序是自頂向下,也就是由上層來逐層嘗試加載此類。類執(zhí)行機(jī)制JVM是基于棧的體系結(jié)構(gòu)來執(zhí)行class字節(jié)碼的。線程創(chuàng)建后,都會(huì)產(chǎn)生程序計(jì)數(shù)器(PC)和棧(Stack),程序計(jì)數(shù)器存放下一條要執(zhí)行的指令在方法內(nèi)的偏移量,棧中存放一個(gè)個(gè)棧幀,每個(gè)棧幀對(duì)應(yīng)著每個(gè)方法的每次調(diào)用,而棧幀又
5、是有局部變量區(qū)和操作數(shù)棧兩部分組成,局部變量區(qū)用于存放方法中的局部變量和參數(shù),操作數(shù)棧中用于存放方法執(zhí)行過程中產(chǎn)生的中間結(jié)果。棧的結(jié)構(gòu)如右圖所示:JVM學(xué)習(xí)筆記(三)------內(nèi)存管理和垃圾回收J(rèn)VM內(nèi)存組成結(jié)構(gòu)JVM棧由堆、棧、本地方法棧、方法區(qū)等部分組成,結(jié)構(gòu)圖如下所示:1)堆:所有通過new創(chuàng)建的對(duì)象的內(nèi)存都在堆中分配,其大小可以通過-Xmx和-Xms來控制。堆被劃分為新生代和舊生代,新生代又被進(jìn)一步劃分為Eden和Survivor區(qū),最后Survivor由FromSpace和ToSpace組成,結(jié)構(gòu)圖如下所示:新生代:新建的對(duì)象都是用新生代分配內(nèi)存,Eden空間不足的時(shí)候,會(huì)把存活
6、的對(duì)象轉(zhuǎn)移到Survivor中,新生代大小可以由-Xmn來控制,也可以用-XX:SurvivorRatio來控制Eden和Survivor的比例。舊生代:用于存放新生代中經(jīng)過多次垃圾回收仍然存活的對(duì)象2)棧:每個(gè)線程執(zhí)行每個(gè)方法的時(shí)候都會(huì)在棧中申請(qǐng)一個(gè)棧幀,每個(gè)棧幀包括局部變量區(qū)和操作數(shù)棧,用于存放此次方法調(diào)用過程中的臨時(shí)變量、參數(shù)和中間結(jié)果3)本地方法棧:用于支持native方法的執(zhí)行,存儲(chǔ)了每個(gè)native方法調(diào)用的狀態(tài)4)方法區(qū):存放了要加載的類信息、靜態(tài)變量、final類型的常量、屬性和方法信息。JVM用持久代(PermanetGeneration)來存放方法區(qū),可通過-XX:Per
7、mSize和-XX:MaxPermSize來指定最小值和最大值垃圾回收機(jī)制JVM分別對(duì)新生代和舊生代采用不同的垃圾回收機(jī)制新生代的GC:新生代通常存活時(shí)間較短,因此基于Copying算法來進(jìn)行回收,所謂Copying算法就是掃描出存活的對(duì)象,并復(fù)制到一塊新的完全未使用的空間中,對(duì)應(yīng)于新生代,就是在Eden和FromSpace或ToSpace之間copy。新生代采用空閑指針的方式來控制GC觸發(fā),指針保持最后一個(gè)