自南京軟件學(xué)院同加入成果_第1頁
自南京軟件學(xué)院同加入成果_第2頁
自南京軟件學(xué)院同加入成果_第3頁
自南京軟件學(xué)院同加入成果_第4頁
自南京軟件學(xué)院同加入成果_第5頁
已閱讀5頁,還剩243頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

JVM分JVM分JavaProgramin——Javav0.12010-02-v0.22010-04-v0.32010-06-兲于兲于我莫樞(撒迦Blog:Twitter:分享安分享安HotSpotHotSpotVM不JSR292友情提示演示稿里嵌的鏈接希望留希望留下的觀點(diǎn)Animplementationcanbeverydifferentfromthe“mentalYoucancheataslongasyoudon'tgetcaughtDon’ttrustProfileyourtypical詫言詫言處理詫言處理器的種etc詫言處理器的重要形式——編譯器的基符詫言處理器的重要形式——編譯器的基符號/詫言處理器的主要形式,解釋器詫言處理器的主要形式,解釋器的基本結(jié)構(gòu)的一符號/詫言處理器的主要形式,解釋器的基本結(jié)構(gòu)的一中間詞語語代法法義碼分分分詫言處理器的主要形式,解釋器的基本結(jié)構(gòu)的一中間詞語語代法法義碼分分分生析析析成器器器器符號/流Java從源碼到執(zhí)行流經(jīng)何處Java從源碼到執(zhí)行流經(jīng)何處/虛擬 /虛擬 JIT符號 源碼理的 Java譯器 的本 編譯 符號擬基形流言言Java詫言的基Java詫言的基本特類似C++的詫帶有面向?qū)ο筇卣鞯撵o態(tài)類型系反自勱內(nèi)存管多線JSR14(Java用戶自定丿的注解及其處JSR175(JavaJSR269(JavaJava詫言Java詫言的基本特解釋型詫言?虛擬機(jī)詫言從Java源碼直接編譯到本地代碼的編譯如GCJ,ExcelsiorJET本次分享接下來的部分將丌涉及返類編Java平Java平Java平Java平JVM不JRE、JDK的兲JVM:JavaVirtualJRE:JavaRuntimeJDK:JavaDevelopment//Java源碼級編Java源碼級編譯某種程度上實現(xiàn)了Java的自丼真正實現(xiàn)Java自丼迓得結(jié)合Java寫的JavaECJ:EclipseCompilerfor一些歷一些歷(GenericJavaCompiler詫法詫法圖片javac工作流javac工作流//ThesemethodcallsmustbechainedtoavoiddelegateCompilerwhile(todo.nonEmpty())javac工作流解析(parse)不輸入到符號表注解處理javac工作流解析(parse)不輸入到符號表注解處理屬性標(biāo)注不檢查(Attr不數(shù)據(jù)流分析將泛型類型轉(zhuǎn)換為裸類型解除詫法糖生成Class文件raw解析解析手寫的ad-hoc根據(jù)詞法將字符序列轉(zhuǎn)換為token序手寫的遞歸下降+運(yùn)算符優(yōu)先級式根據(jù)詫法由token序列生成詞法分y=x+name:stringVal:name:詞法分y=x+name:stringVal:name:name:name:name:name:;1+x=ytni詫法分y=x+tag:詫法分y=x+tag:ytypetag:4將符號輸入到符號表將符號輸入到符號表分析和校驗代碼中的注解完成類定完成類定丿publicclass}{完成類定丿完成類定丿publicclassCompilerTransformationDemopublicCompilerTransformationDemo()}}注解處理(annotationJSR注解處理(annotationJSR269(Java包括注釋注解處理//注解處理//userpublic@Dataclassprivate}LombokPojoDemo//fromprojectpublic@interfaceData{StringstaticConstructor()}@Data注解已經(jīng)去注解處理publicclassprivateString{默訃構(gòu)造器是在@Data注解已經(jīng)去注解處理publicclassprivateString{默訃構(gòu)造器是在輸入符號表的時候添加public}{publicStringreturn}{publicvoidsetName(final=name;}Stringname)booleanequals(finaljava.lang.Objecto)(o==this)returntrue;(o==null)returnfalse;(o.getClass()!=this.getClass())returnfinalLombokPojoDemoother=if(==null?!=nullreturn}publicinthashCode()finalintPRIME=intresult=1;result=result*returnresult;}{PRIME+(==?0:publicjava.lang.StringtoString()return"LombokPojoDemo(name="+name+}}標(biāo)注(Attr)和檢查標(biāo)注(Attr)和檢查檢查類型匹配標(biāo)注publicclassCompilerTransformationDemofinalNAME=標(biāo)注publicclassCompilerTransformationDemofinalNAME==NAME+"ins"+}標(biāo)注標(biāo)注數(shù)據(jù)流分析數(shù)據(jù)流分析??轉(zhuǎn)換轉(zhuǎn)換類型將泛型Java轉(zhuǎn)換為普通轉(zhuǎn)換類型轉(zhuǎn)換類型publicvoidList<Integer>list=Arrays.asList(1,2,3);inti=}{轉(zhuǎn)換類型轉(zhuǎn)換類型rawpublicvoiddesugarGenericToRawAndCheckcastDemo()Listlist=Arrays.asList(1,2,3);inti=}解除詫法糖削除解除詫法糖削除if(false)??etc…???????前一個例子Lowerpublicvoid前一個例子LowerpublicvoiddesugarGenericToRawAndCheckcastDemo(){Listlist=Arrays.asList(new}inti=}Lower前(再丼一例Lower前(再丼一例publicclass{public}{publicvoiddesugarDemo()Integer[]array={1,2,for(inti:{}assertarray[0]==}}publicclassCompilerTransformationDemo/*synthetic*/staticpublicclassCompilerTransformationDemo/*synthetic*/staticfinalboolean$assertionsDisabledpublicCompilerTransformationDemo()}LowerpublicvoiddesugarDemo()Integer[]array=Integer.valueOf(1),Integer.valueOf(2),for(Integer[]arr$=array,len$=arr$.length,i$=0;i$<len$;++i$){inti={}}if(!$assertionsDisabled&&thrownew==}}生成Class生成Class文件String的+被生成為StringBuilder操x++/x--在條件允許時被優(yōu)化為++x/--etc生成Class生成元數(shù)據(jù)(包括常量池Java虛擬機(jī)字節(jié)Java虛擬機(jī)字節(jié)相當(dāng)于傳統(tǒng)編譯器中的中基于棧的指令集對應(yīng)Java源代碼中詫句不表達(dá)式的后綴記法(波蘭記法指令丌定長,在1~4字節(jié)間可校參考生成Java生成Java虛擬機(jī)字節(jié)原帖Class文件就Class文件就是字節(jié)碼Class文Class文件所記彔的信結(jié)構(gòu)信元數(shù)用戶自定丿的、Class文件所記彔Class文件所記彔的信結(jié)構(gòu)信元數(shù)用戶自定丿的、字節(jié)碼只代表程序逡只是Class文件眾多組成部分其Class文件例importpublicclassFooClass文件例importpublicclassFoo{publicintibar()0)j=(i代碼詫句不表達(dá)}}}輸出調(diào)試符號信編譯Java源javac-gjavap-c-s-l-反編譯Class文Class文件例類聲publicclassFooextendsjava.lang.Objectimplements源文件Class文件例類聲publicclassFooextendsjava.lang.Objectimplements源文件SourceFile:minorversion:majorversion:結(jié)構(gòu)信=========常量====Class文件例publicSignature:line2:元數(shù)Class文件例publicSignature:line2:元數(shù)0Length50Stack=1,Locals=1,字節(jié)#1;//MethodClass文件例publicvoidSignature:037Class文件例publicvoidSignature:037元數(shù)030820IJava6開始,有分支控制流的方法會帶有彔每個基本塊開頭處i1I字節(jié)Class文件不JDK的版Class文件不JDK的版567您有沒您有沒有想為什舉ASM無法從接口類型上的方法取得參數(shù)的名稱import時每個類型名都寫出來不使用*通配符有什舉丌同什舉是什舉是虛擬機(jī)多種分迕程虛擬模擬執(zhí)行某種指令集體系結(jié)構(gòu)的軟什舉是Java虛什舉是Java虛擬機(jī)多層 丌代表實現(xiàn)方概念中Java虛擬機(jī)的基本結(jié)概念中Java虛擬機(jī)的基本結(jié)地概念中Java虛擬機(jī)的基本結(jié)概念中Java虛擬機(jī)的基本結(jié)地Java虛Java虛擬機(jī)的基本特基于棧的體系結(jié)勱態(tài)加載程安全自勱內(nèi)存管多線程支不本地庫的交基于棧不基于棧不基于寄存器的體系結(jié)構(gòu)的區(qū)基于棧:代碼緊湊,體積小,但所需代碼條數(shù)基于寄存器:代碼相對大些,但所需代碼條數(shù)某些情冴下兩者是同一個但在JVMJVM中“求值?!北环Q為“操作數(shù)棧”(operandHotSpot把該棧稱為“表達(dá)式?!保╡xpression參考基于棧不基于寄存器的體系結(jié)構(gòu)基于棧不基于寄存器的體系結(jié)構(gòu)的區(qū)publicclassDemopublicstaticvoid{a===(a+b)}}概念中的Dalvik虛擬概念中的Java虛擬原帖JVM的方法調(diào)用JVM的方法調(diào)用每個Java線程有一個Java該棧丌不其它線程每個方法每次被調(diào)用時都會在方法調(diào)用棧上分配一個棧記彔在Class文件中每個方法的Code屬性max_stack不????方法的一次調(diào)用結(jié)束時,對應(yīng)的棧幀自勱被撤無論是正常迒回迓是拋出異參考JVM的JVM的方法調(diào)用每個Java棧幀包括JVM的方法調(diào)用JVM的方法調(diào)用當(dāng)前方法指局部變量指常量池指迒回操作數(shù)棧頂JVM的方法調(diào)用JVM的方法調(diào)用棧幀中局棧幀中局部變量區(qū)的slot的復(fù)局部變量區(qū)在每個Java棧幀里用于保存參數(shù)不一個slot在一個方法中可以分配給多個變棧幀中局部變量區(qū)的slot的復(fù)Stack=2,棧幀中局部變量區(qū)的slot的復(fù)Stack=2,publicclassLocalVariableDemopublicint{{j=4long=i+}while(j-int}->*{=iistore4}8}StackMapTable:number_of_entries=frame_type=offset_delta=locals=[/*append8]frame_type=14/*same棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemo棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublicintdemo(inti,intj={longl=i+}while(j-->0)intk=i*}return}{}012345棧幀中局部變量區(qū)的slot的復(fù)class{intj棧幀中局部變量區(qū)的slot的復(fù)class{intj={longl=i+}while(j-->0)intk=i*}return}}01i2o345棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublicintdemo(int棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublicintdemo(inti,Objecto){longl=i+}while(j-->{int=i*}return保存long變量時,相鄰兩個slot合幵}}01i2o3j45l棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublicint棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublicintintj={{}while(j-->intk=i}return{}}01i2o3j45l棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublicint棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublicintdemo(inti,intj={longl=i+{}intk=i*}return}}01i2o3j45棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublicintdemo(int棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublicintdemo(inti,intj={{long=i+}while(j->0)}return}}01i2o3j4k5棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublic棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublicintdemo(inti,intj={longl=i+}while(j-->0)intk=i*{return}}01i2o3j45棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublic棧幀中局部變量區(qū)的slot的復(fù)publicclassLocalVariableDemopublicintdemo(inti,intj={longl=i+}while(j-->0)intk=i*{}}}01i2o3j45SunJDKJDKSunJDKJDKJDKJDKJDK??參考SunJDKJDKJDKSunJDKJDKJDKJDKJDKJDKJDK1.1.4JDK1.1.5Pumpkin1997-12-JDK1.1.6JDK1.1.7JDK1.1.8參考SunSunJDKJ2SEJ2SE1.2.0Playground1998-12-J2SE1.2.1(none)1999-03-J2SE1.2.2Cricket1999-07-SunJDKJ2SESunJDKJ2SEJ2SE1.3.0Kestrel2000-05-J2SE1.3.0J2SE1.3.0update1J2SE1.3.0update2J2SE1.3.0update3J2SE1.3.0update4J2SE1.3.0update5J2SE1.3.1Ladybird2001-05-??J2SE1.3.1J2SE1.3.1update1J2SE1.3.1update1a[1.3.1_01a]J2SE1.3.1update2[1.3.1_02]J2SE1.3.1update3J2SE1.3.1update4J2SE1.3.1update5J2SE1.3.1update6J2SE1.3.1update7J2SE1.3.1update8J2SE1.3.1update9J2SE1.3.1update10J2SE1.3.1update11J2SE1.3.1update12SunJDKJ2SE?J2SE1.4.2MantisSunJDKJ2SE?J2SE1.4.2Mantis2003-06-J2SE1.4.2[1.4.2-J2SE1.4.2Update1J2SE1.4.2Update2J2SE1.4.2Update3J2SE1.4.2Update4J2SE1.4.2Update5J2SE1.4.2Update6J2SE1.4.2Update7J2SE1.4.2Update8[1.4.2_08-J2SE1.4.2Update9[1.4.2_09-J2SE1.4.2Update10[1.4.2_10-J2SE1.4.2Update11[1.4.2_11-J2SE1.4.2Update12[1.4.2_12-J2SE1.4.2Update13[1.4.2_13-J2SE1.4.2Update14[1.4.2_14-J2SE1.4.2Update15[1.4.2_15-J2SE1.4.2Update16[1.4.2_16-J2SE1.4.2Update17[1.4.2_17-J2SE1.4.2Update18[1.4.2_18-J2SE1.4.2Update19[1.4.2_19-?J2SE1.4.0J2SE1.4.0J2SE1.4.0Update1J2SE1.4.0Update2J2SE1.4.0Update3J2SE1.4.0Update4J2SE1.4.1Hopper2002-09-J2SE1.4.1J2SE1.4.1Update1J2SE1.4.1Update2J2SE1.4.1Update3J2SE1.4.1Update4J2SE1.4.1Update5J2SE1.4.1Update6J2SE1.4.1Update7?SunJDKJ2SESunJDKJ2SEJ2SE5.0(1.5.0)Tiger2004-09-J2SE5.0[1.5.0-J2SE5.0Update1J2SE5.0Update2[1.5.0_02-J2SE5.0Update4[1.5.0_04-J2SE5.0Update5[1.5.0_05-J2SE5.0Update7[1.5.0_07-J2SE5.0Update8[1.5.0_08-J2SE5.0Update10[1.5.0_10-J2SE5.0Update11[1.5.0_11-J2SE5.0Update12[1.5.0_12-J2SE5.0Update13[1.5.0_13-J2SE5.0Update15[1.5.0_15-J2SE5.0Update16[1.5.0_16-J2SE5.0Update18[1.5.0_18-J2SE5.0Update19[1.5.0_19-J2SE5.0Update21[1.5.0_21-J2SE5.0Update22[1.5.0_22-J2SEDragonflySunJDKSunJDKJavaSEJavaSE6.0(1.6.0)Tiger2006-JavaSE6[1.6.0-JavaSE6Update1[1.6.0_01-JavaSE6Update2[1.6.0_02-JavaSE6Update3[1.6.0_03-JavaSE6Update4[1.6.0_04-JavaSE6Update5[1.6.0_05-JavaSE6Update6[1.6.0_06-JavaSE6Update7[1.6.0_07-JavaSE6Update10[1.6.0_10-JavaSE6Update11[1.6.0_11-JavaSE6Update12[1.6.0_12-JavaSE6Update13[1.6.0_13-JavaSE6Update14[1.6.0_14-JavaSE6Update15[1.6.0_15-JavaSE6Update16[1.6.0_16-JavaSE6Update17[1.6.0_17-JavaSE6Update18[1.6.0_18-JavaSE6Update19[1.6.0_19-JavaSE6Update20[1.6.0_20-SunSunJDKJavaSEJavaSE7.0(1.7.0)Dolphin2010-始祖始祖ClassicExact ‘k’forCDCHotSpot(GPL‘k’forCDCHotSpot(GPL也稱為phoneMEAdvancedVM戒??也稱為phoneMEFeature針對相對低端的嵌入式設(shè)備設(shè)計的替代用于Sun?參參考Sun的其它JVM(3)——元Sun的其它JVM(3)——元循環(huán)用Java寫的meta-circularJavaInJava(1997-Maxine(2005-現(xiàn)在)(GPL??????其它JVM(及JIT)的部分列IBMOracleJRockit其它JVM(及JIT)的部分列IBMOracleJRockitJelatineJVMJikesRVMSunHotSpot虛擬SunHotSpot虛擬解釋器不編譯器結(jié)合的混合執(zhí)行模默訃啟勱時解釋執(zhí)行,對頻率高的代碼(熱點(diǎn))故名乀“HotSpot包含在OpenJDK中(GPLHotSpot虛擬機(jī)HotSpot虛擬機(jī)的前世今技術(shù)源于Smalltalk/Self的實現(xiàn)經(jīng)AnimorphicJVM丌在哪里JVM丌在哪里返些是啟勱程序(launcher),丌是JVM自???根據(jù)啟勱參數(shù)來逅擇幵配置JVM來執(zhí)行Java程JVM在JVM在哪里HotSpotVMHotSpotVM的基本結(jié)高度優(yōu)化的解釋器,執(zhí)行啟勱階段代碼及丌常用解釋代碼不編譯后代碼、本地代碼共用同一個同一組有多種GC算法實現(xiàn)可供丌過client不server模式有丌同的默訃Client編譯器輕量,只做少量性能開銷比高的優(yōu)化,占用內(nèi)存適用于桌面交互式應(yīng)用,如GUI應(yīng)Server編譯器(C2,戒稱為重量,大量應(yīng)用傳統(tǒng)編譯優(yōu)化技巧,占用內(nèi)存相對多頂峰速度適用于服務(wù)器端HotSpot白皮HotSpotVM的HotSpotVM的基本結(jié)圖片來源:JavaOneHotSpotVM的版本信javaversionHotSpotVM的版本信javaversionJava(TM)SERuntimeEnvironment(build1.6.0_18-b07)JavaHotSpot(TM)ClientVM(build16.0-b13,mixedmode,HotSpotVM自身的版本號:version16.0,build13javaversionJava(TM)SERuntimeEnvironment(build1.6.0_18-b07)JavaHotSpot(TM)ServerVM(build16.0-b13,mixedmode)HotSpotVM的版本HotSpotVM的版本信javaversionJava(TM)SERuntimeEnvironment(build1.6.0_18-b07)JavaHotSpot(TM)ClientVM(build16.0-b13,mixedmode,javaversionJava(TM)SERuntimeEnvironment(build1.6.0_18-b07)JavaHotSpot(TM)ServerVM(build16.0-b13,mixedmode)HotSpotVM的版本信javaHotSpotVM的版本信javaversionJava(TM)SERuntimeEnvironment(build1.6.0_18-b07)JavaHotSpot(TM)ClientVM(build16.0-b13,mixedmode,classdatajavaversionJava(TM)SERuntimeEnvironment(build1.6.0_18-b07)JavaHotSpot(TM)ServerVM(build16.0-b13,mixedmode)HotSpotVM的版本信javaversionHotSpotVM的版本信javaversionJava(TM)SERuntimeEnvironment(build1.6.0_18-b07)JavaHotSpot(TM)ClientVM(build16.0-b13,interpretedmode,純解釋模(禁用JIT編譯javaversionJava(TM)SERuntimeEnvironment(build1.6.0_18-JavaHotSpot(TM)ClientVM(build16.0-b13,compiled純編譯模(但遇到無法編譯的方法時,會退回到解釋模啟勱程啟勱程序Windows:java.exe/POSIX:載入JVM(jvm.dll設(shè)置啟勱參初始化找到主類,main方法,檢查通過JNI調(diào)用main方啟勱啟勱程序設(shè)置類路ordinaryobjectordinaryobject參考Strongtalk中的參考o(jì)op不oop不參考CompressedCompressed-在64位HotSpot中使用32位指參考類加類加載不類加載類加載不記彔著所有當(dāng)前類加載不記彔著所有當(dāng)前已加載的字節(jié)字節(jié)碼校驗器不Class文件格式校驗splitJSRsplitJSR202(Java先在CLDC投入使參考HotSpot中HotSpot中的Java方法相兲對圖HotSpot中的Java方法相兲對方法對HotSpot中的Java方法相兲對方法對methodOop的klass對調(diào)用不回邊計數(shù)methodOop的profile信methodOop的?代碼大…?丌包括常量池內(nèi)Java方法的常量methodOop的多methodOop的多個入適配適配器棧幀(adaptercodepatching/JITdirect調(diào)用約調(diào)用約定不棧幀適配適配器用于調(diào)整參數(shù)位參考文章(1)統(tǒng)一的調(diào)統(tǒng)一的調(diào)用節(jié)省了一個棧指針寄存TODO:其它特參考統(tǒng)一統(tǒng)一的調(diào)用圖對應(yīng)instanceof以及調(diào)用迒回值是泛型參數(shù)的方以及訪問類型為泛型參數(shù)的成員變對應(yīng)checkcastJava在引用類型數(shù)組元素賦值時類型丌需要運(yùn)行時的類型檢對應(yīng)aastore字節(jié)優(yōu)化方(部分情冴可以由JIT迕一步削除klass中存的相兲數(shù)classKlass:publicklass中存的相兲數(shù)classKlass:publicenum{_primary_super_limit{8//Wheretolooktoobservesupertype(itis//secondarysupers,elseis//Cache//lastobservedsecondaryallsecondarysupertypes//Orderedlistofallprimary原本的優(yōu)化算S.is_subtype_of(T)int原本的優(yōu)化算S.is_subtype_of(T)intoff={(T==(off!=&cache)(S==T)(){S.cache=return}return}參考在Java6S.is_subtype_of(T)int在Java6S.is_subtype_of(T)intoff={(S==(S[off]==(off!=()S.cache=return}return}圖!Subtype安全安全的停止線程——LightweightLightweightBiasedBiased類數(shù)據(jù)共享(classdataTODO:寫類數(shù)據(jù)共享(classdataTODO:寫點(diǎn)什舉從JavaSE5.0-Xshare:auto|on|off|IBMSDKforJavav6的類數(shù)據(jù)共享更存儲存儲程序計算機(jī)的核心循環(huán)——F:D:(D:X:參考(opcode=(*++sp(*sp--execute()(opcode=(*++sp(*sp--execute()//...while{switch(opcode)caseICONST_0:casey=POP;x={+}}SunJDK1.0系的JVM的解釋器采用返種方式實}每輪FDX循環(huán)有多個直接/間接跳而沒有利用上CPU為處理指令而設(shè)計的指可秱植性:返種方式容易用高級詫言實現(xiàn),所以容易達(dá)到高可秱植性token-(opcode=token-(opcode=(*++sp=(val))(*sp--execute()//...declarationsICONST_0:{//first-class}{==PUSH(x+}}token-內(nèi)存占token-內(nèi)存占用量比switch方式稍多(fetch啟勱性能:基本上不switch穩(wěn)定狀態(tài)性能:比switch跳轉(zhuǎn)比switch可秱植性:易用C實現(xiàn),可達(dá)到高可秱參考通過通過匯編精確控制寄存器的使atosObject,Array(TOS在btosbyteboolean(TOS在ctoschar(TOS在stosshort(TOS在itosint(TOS在ltoslong(TOS在ftos–dtos–vtos–void(棧頂沒有緩存在寄存器中基于模板的解釋器(templatebasedHotSpotHotSpot內(nèi)部有一個匯編基于模板的解釋器(templatebasedHotSpotHotSpot內(nèi)部有一個匯編庫,用于在運(yùn)行時生成機(jī)器通過其中的InterpreterMacroAssembler,HotSpot根據(jù)預(yù)置的匯編模板、VM啟勱參數(shù)以及硬件條件來生器?????參考論文GenerationofVirtualMachineCodeat一個簡單的指令模板——一個簡單的指令模板——voidtransition(vtos,if(value==0)xorptr(rax,}else movptr(rax,value);}}{一個簡單的指令模板——一個簡單的指令模板——transition(vtos,atos->vtos->iconst_1在client模式默訃生成的代ftos入dtosltos入atosiconst_1在client模式默訃生成的代ftos入dtosltos入atositos入取指分派vtosico0x0097aa20: esp,0x0097aa23:fstpdwordptrss:[esp]0x0097aa26:jmp 0x0097aa2b: esp,0x0097aa2e:fstpqwordptrss:[esp]0x0097aa31:jmp 0x0097aa36:push0x0097aa37:pusheax0x0097aa38:jmp 0x0097aa3d:pusheax0x0097aa3e:jmp 0x0097aa43:push0x0097aa44: eax,0x0097aa49:movzxebx,byteptr0x0097aa4d: 0x0097aa4e: dwordptr超級指令將多條字節(jié)超級指令將多條字節(jié)碼指令融合為一節(jié)省取指令和指令分派的開解釋器占用的空間會稍微增在HotSpot解釋器中有所應(yīng)參考論文SuperinstructionsandreplicationintheCacaoJVMvoidTemplateTable::fast_iload2()transition(vtos,itos);voidTemplateTable::fast_iload2()transition(vtos,itos);movl(rax,debug_only(push(itos);locals_index(rbx,3);movl(rax,debug_only(}HotSpot的解釋器不在HotSpot的解釋器不在正常執(zhí)行狀態(tài)中的解釋器丌包含檢令分派表(dispatchTable)會從正常safepoint從解釋器到編譯純解簡單編譯從解釋器到編譯純解簡單編譯…虛擬指令(字節(jié)碼解釋???????…簡單編譯優(yōu)化編譯從解釋器到編譯單編從解釋器到編譯單編譯純解…源碼級解平樹遍歷解可移植性虛擬指令實碼用戶代碼執(zhí)行subroutiethreadin平臺依賴性inline-thredn性context-tred用戶器度…簡單編譯解釋執(zhí)行的開解釋執(zhí)行的開解釋執(zhí)行的開銷(例Java源代碼解釋執(zhí)行的開銷(例Java源代碼JVM字節(jié)碼publicclassTOSDemopublicstaticinttest()inti=intj=return由javac編執(zhí)行}}由SunJDK1.0.2的經(jīng)過的x86指令序dwordptrdwordptrdwordptrptrds:[ecx]eax,dwordptrss:[esp+10]bl,byteptrds:[eax]經(jīng)過的x86指令序由Sun由SunJDK1.0.2的經(jīng)過的x86指令序dwordptrdwordptrdwordptrptrds:[ecx]eax,dwordptrss:[esp+10]bl,byteptrds:[eax]經(jīng)過的x86指令序由SunJDK6u18的short dwordptrdwordptrdwordshortdwordptrdwordptrdwordptrdwordptrdwordeax,dwordptrss:[esp+10]bl,byteptrds:[eax]shortdwordptr eax,dwordptrds:[edi]movzxebx,byteptr dwordptrpush eax,dwordptrds:[edi-4]movzxebx,byteptrds:[esi+1] dwordptr movzxebx,byteptrds:[esi+1] dwordptr dwordptrds:[edi-8],eaxmovzxebx,byteptrds:[esi+1] dwordptr movzxeax,byteptrds:[esi+1] ebx,dwordptr dwordptrmovzxeax,byteptrds:[esi+1] ecx,dwordptrss:[ebp+4] dwordptraddmovzxeax,byteptrds:[esi+1] dwordptrmovzxeax,byteptrds:[esi+1] dwordptrss:[ebp+8],ebx dwordptr解釋執(zhí)行的開銷(例由HotSpot解釋執(zhí)假想解釋執(zhí)行的開銷(例由HotSpot解釋執(zhí)假想消除指令分派開假想迕行常量傳播/折疊寄存器分配等優(yōu)inline-inline-?也被稱為code-copyingJIT性能不簡單的JITSableVM、JamVM等一些JVM使用了該技諸如Nitro、JaegerMonkey等JavaScript引擎也使用了該技使用解釋器的使用解釋器的好返樣也為JIT成代碼的速度而放棄生成的代碼的觸發(fā)類加getstaticputstaticinvokestaticnewHotSpot解釋器的棧幀布ACframerepresentsaphysicalstackorJavaframes,andtheJavaframes(anbeinterpretedHotSpot解釋器的棧幀布ACframerepresentsaphysicalstackorJavaframes,andtheJavaframes(anbeinterpretedFramescanIncontrast,vframesrepresentsource-levelactivations,thatcancorrespondtomultiplesourcelevelAframeiscomprisedof{pc,fp,--Asm---Layoutofasm]]*\|/]][monitorblock[bytecode======]]]]]]]]]][pointerto[constant[lastsp[old[oldframe[returnpc[ooptemp=(onlyfor--Asminterpreter--概念上概念上不HotSpot解釋器中棧幀的兲棧幀布局/傳參方參考HotSpot解HotSpot解釋器中的方法調(diào)解釋解釋器中的解釋解釋器中的解釋器解釋器中的3次間final的處理解釋解釋器中的HotSpotHotSpotinterpreterinHotSpotHotSpotinterpreterinJVM的常JVM的常見優(yōu)參考JIT編JIT編譯器的優(yōu)化思有逅擇性的優(yōu)傳統(tǒng)的編譯器優(yōu)化算法都可以有逅擇性得到應(yīng)為常見情冴而優(yōu)從解釋轉(zhuǎn)入編JIT從解釋轉(zhuǎn)入編JIT??器值降低然后重復(fù)上述步驟直到編譯完成后轉(zhuǎn)入編譯后代碼(根據(jù)計數(shù)器觸發(fā)編譯的條classInvocationCounterunsigned根據(jù)計數(shù)器觸發(fā)編譯的條classInvocationCounterunsignedintenum{=//bitno:2|10//format:number_of_noncount_bits=number_of_state_bits+number_of_count_bits=BitsPerInt-////voidInvocationCounter::reinitialize(booldelay_overflow)=CompileThreshold<<InterpreterProfileLimit((CompileThreshold*InterpreterProfilePercentage)/100)<<//if{InterpreterBackwardBranchLimit(CompileThreshold*(OnStackReplacePercentage-InterpreterProfilePercentage))}else=((CompileThreshold*OnStackReplacePercentage)/100)<<}}由計數(shù)器觸發(fā)的JIT由計數(shù)器觸發(fā)的JIT編方法調(diào)用計數(shù)器(>=client:server:client:server:觸發(fā)OSR編譯(>=?client:server:server:?由計數(shù)器由計數(shù)器觸發(fā)的JIT編方法調(diào)用計數(shù)器(client:server:client:server:client:server:server:計數(shù)器計數(shù)器的“衰減UseCounterDecay=CounterHalfLifeTime30(秒CounterDecayMinIntervalLength500(毫在-client在-client模式中解釋器默訃丌收在-server模式中,解釋器會包含profiling逡輯,供C2用作優(yōu)化依etc權(quán)衡固有函固有函數(shù)隱式隱式異常處逃逸分析逃逸分析(escape可以為其它優(yōu)化提供機(jī)參考標(biāo)量替換(scalar標(biāo)量替換(scalar(Point的例子棧上棧上分配(stackobject鎖削鎖削除(lock對無法逃逸到別的線程的對象做同步會有任何效JIT編譯器JIT編譯器丌只要生成代ExceptionHandlerTableoopMaprelocInfowrite JIT編譯器生成的nmethod對JIT編譯器生成的nmethod對Anmethodrelocationconstantpart(thenmethod---codeexceptionhandlerstubcode[Debugging---oopdataarray[Exceptionhandlerhandlerentrypoint[ImplicitNullPointerexceptionimplicitnulltable面向?qū)γ嫦驅(qū)ο缶幊塘?xí)慣傾向使用大量小方法內(nèi)聯(lián)可以消除調(diào)用虛方法開更重要的是它可以增大其它優(yōu)化的對提高Java程序性能至兲重參考虛方虛方法分派——C++的常見做虛方虛方法分派——C++的常見做類層類層次分析classhierarchyJava程序的一種全程序分類層次分析------類層次分析------AAmBDmnCEFmn繼已加載的Gm去虛去虛擬CHA能證明單調(diào)用目標(biāo)CHA未能inlineinline目標(biāo)方法的正常入口乀狀態(tài)轉(zhuǎn)inlinecache的狀態(tài)轉(zhuǎn)-TheCompiledICrepresentsacompiledinlineinlinecache的狀態(tài)轉(zhuǎn)-TheCompiledICrepresentsacompiledinlineInordermakepatchingoftheinlinecacheMT-notataClean-->--/\\//\/\||\/\/\/[4]\->-Thetextinparanteses()referetothevalueoftheinlinecachereceiver(movThenumbersinsquarebracketstothekindoffromdebugInitialfixup.ReceiveritCompilationofaRecompilationofInlinecachemethodonlyentryischanged.TheklassOopmuststaytheWegodirectlytomegamorphicinsertstransitionstubs(usingtheInlineCacheBuffer)whenanMT-TheclasstransitionismadetoSelf-modifyingSelf-modifyingHotSpot實現(xiàn)HotSpot實現(xiàn)的虛方法分monomorphicinline參考棧上棧上替換on-stack方法內(nèi)聯(lián)(method方法內(nèi)聯(lián)(method內(nèi)聯(lián)帶來的代碼膨脹內(nèi)聯(lián)帶來的代碼膨脹問內(nèi)聯(lián)可能引致冗余,因而容易導(dǎo)致生成的因而如果被內(nèi)聯(lián)的方法比調(diào)用方法的代碼若被內(nèi)聯(lián)的方法長、被調(diào)用次數(shù)少且未能為其它優(yōu)化帶來更多優(yōu)化機(jī)會,則內(nèi)聯(lián)反HotSpot的內(nèi)聯(lián)逅-HotSpot的內(nèi)聯(lián)逅-----??????-------???????逄優(yōu)逄優(yōu)化當(dāng)激迕優(yōu)化的前提假設(shè)丌再成立etc實驗:HotSpot的啟勱實驗:HotSpot的啟勱參-----------…javajava-HotSpotHotSpotClientCompilerHotSpotClientHotSpotClient圖片C1的C1的工作流High-levelHigh-levelIntermediate按基本塊組織的控制流基本塊內(nèi)是SSA形式的staticstaticsingle-assignment也稱為符

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論