版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、淘寶技術(shù)大學(xué) 應(yīng)屆生培訓(xùn) JVM工作原理課程組:雷卷 小邪 九穆版本:第一版2009年達到的目目標(biāo)知道Java虛擬機的的生存周周期知道JVM的體系結(jié)結(jié)構(gòu)知道JVM體系結(jié)構(gòu)構(gòu)中的各各個部分分能對JVM有個大致致清晰的的了解內(nèi)容JVM的生命周周期JVM的體系結(jié)結(jié)構(gòu)JVM類加載器器JVM執(zhí)行引擎擎JVM運行時數(shù)數(shù)據(jù)區(qū)JVM垃圾回收收問題JVM的生命周周期一、首先先分析兩兩個概念念JVM實例和JVM執(zhí)行引擎擎實例(1)JVM實例對應(yīng)應(yīng)了一個個獨立運運行的java程序它是進程程級別(2)JVM執(zhí)行引擎擎實例則則對應(yīng)了了屬于用用戶運行行程序的的線程它是線程程級別的的JVM的生命周周期二、JVM的生命周周期
2、(1)JVM實例的誕誕生當(dāng)啟動一一個Java程序時,一個JVM實例就產(chǎn)產(chǎn)生了,任何一一個擁有有publicstatic voidmain(Stringargs)函數(shù)的class都可以作作為JVM實例運行行的起點點(2)JVM實例的運運行main()作為該程程序初始始線程的的起點,任何其其他線程程均由該該線程啟啟動。JVM內(nèi)部有兩兩種線程程:守護護線程和和非守護護線程,main()屬于非守守護線程程,守護護線程通通常由JVM自己使用用,java程序也可可以標(biāo)明明自己創(chuàng)創(chuàng)建的線線程是守守護線程程。(3)JVM實例的消消亡當(dāng)程序中中的所有有非守護護線程都都終止時時,JVM才退出;若安全全管理器器允許
3、,程序序也可以以使用Runtime類或者System.exit()來退出。內(nèi)容JVM的生命周周期JVM的體系結(jié)結(jié)構(gòu)JVM類加載器器JVM執(zhí)行引擎擎JVM運行時數(shù)數(shù)據(jù)區(qū)JVM垃圾回收收問題JVM的體系結(jié)結(jié)構(gòu)JVM的體系結(jié)結(jié)構(gòu)一、JVM的內(nèi)部體體系結(jié)構(gòu)構(gòu)分為三三部分,(1)類裝載載器(ClassLoader)子系統(tǒng)統(tǒng)作用:用來裝載載.class文件(2)執(zhí)行引引擎作用:執(zhí)行字節(jié)節(jié)碼,或或者執(zhí)行行本地方方法(3)運行時時數(shù)據(jù)區(qū)區(qū)方法區(qū),堆,java棧,PC寄存器,本地方方法棧內(nèi)容JVM的生命周周期JVM的體系結(jié)結(jié)構(gòu)JVM類加載器器JVM執(zhí)行引擎擎JVM運行時數(shù)數(shù)據(jù)區(qū)JVM垃圾回收收問題JVM的體系結(jié)
4、結(jié)構(gòu)之類類加載器器一、JVM將整個類類加載過過程劃分分為了三三個步驟驟:(1)裝載裝載過程程負責(zé)找找到二進進制字節(jié)節(jié)碼并加加載至JVM中,JVM通過類名名、類所所在的包包名通過過ClassLoader來完成類類的加載載,同樣樣,也采采用以上上三個元元素來標(biāo)標(biāo)識一個個被加載載了的類類:類名名+包名+ClassLoader實例ID。(2)鏈接鏈接過程程負責(zé)對對二進制制字節(jié)碼碼的格式式進行校校驗、初初始化裝裝載類中中的靜態(tài)態(tài)變量以以及解析析類中調(diào)調(diào)用的接接口、類類。在完成了了校驗后后,JVM初始化類類中的靜靜態(tài)變量量,并將將其值賦賦為默認認值。最后一步步為對類類中的所所有屬性性、方法法進行驗驗證,以
5、以確保其其需要調(diào)調(diào)用的屬屬性、方方法存在在,以及及具備應(yīng)應(yīng)的權(quán)限限(例如如public、private域權(quán)限等等),會會造成NoSuchMethodError、NoSuchFieldError等錯誤信信息。(3)初始化化初始化過過程即為為執(zhí)行類類中的靜靜態(tài)初始始化代碼碼、構(gòu)造造器代碼碼以及靜靜態(tài)屬性性的初始始化,在在四種情情況下初初始化過過程會被被觸發(fā)執(zhí)執(zhí)行:調(diào)用了new;反射調(diào)調(diào)用了類類中的方方法;子子類調(diào)用用了初始始化;JVM啟動過程程中指定定的初始始化類。JVM的體系結(jié)結(jié)構(gòu)之類類加載器器JVM的體系結(jié)結(jié)構(gòu)之類類加載器器一、JVM兩種類裝裝載器包包括:啟啟動類裝裝載器和和用戶自自定義類類裝
6、載器器,啟動動類裝載器是JVM實現(xiàn)的一一部分,用戶自自定義類類裝載器器則是Java程序的一一部分,必須是是ClassLoader類的子類類。二、主主要分為為以下幾幾類:(1)Bootstrap ClassLoader這是JVM的根ClassLoader,它是用用C+實現(xiàn)的,JVM啟動時初初始化此此ClassLoader,并由此此ClassLoader完成$JAVA_HOME中jre/lib/rt.jar(SunJDK的實現(xiàn))中所有有class文件的加加載,這這個jar中包含了了java規(guī)范定義義的所有有接口以以及實現(xiàn)現(xiàn)。(2)Extension ClassLoaderJVM用此classloa
7、der來加載擴擴展功能能的一些些jar包(3)System ClassLoaderJVM用此classloader來加載啟啟動參數(shù)數(shù)中指定定的Classpath中的jar包以及目目錄,在在SunJDK中ClassLoader對應(yīng)的類類名為AppClassLoader。(4)User-Defined ClassLoaderUser-DefinedClassLoader是Java開發(fā)人員員繼承ClassLoader抽象類自自行實現(xiàn)現(xiàn)的ClassLoader,基于自自定義的的ClassLoader可用于加加載非Classpath中的jar以及目錄錄JVM的體系結(jié)結(jié)構(gòu)之類類加載器器三、ClassLoa
8、der抽象類提提供了幾幾個關(guān)鍵鍵的方法法:(1)loadClass此方法負負責(zé)加載載指定名名字的類類,ClassLoader的實現(xiàn)方方法為先先從已經(jīng)經(jīng)加載的的類中尋尋找,如如沒有則則繼續(xù)從從parentClassLoader中尋找,如仍然然沒找到到,則從從SystemClassLoader中尋找,最后再再調(diào)用findClass方法來尋尋找,如如要改變變類的加加載順序序,則可可覆蓋此此方法(2)findLoadedClass此方法負負責(zé)從當(dāng)當(dāng)前ClassLoader實例對象象的緩存存中尋找找已加載載的類,調(diào)用的的為native的方法。(3)findClass此方法直直接拋出出ClassNotFo
9、undException,因此需需要通過過覆蓋loadClass或此方法法來以自自定義的的方式加加載相應(yīng)應(yīng)的類。(4)findSystemClass此方法負負責(zé)從SystemClassLoader中尋找類類,如未未找到,則繼續(xù)續(xù)從BootstrapClassLoader中尋找,如仍然然為找到到,則返返回null。(5)defineClass此方法負負責(zé)將二二進制的的字節(jié)碼碼轉(zhuǎn)換為為Class對象(6)resolveClass此方法負負責(zé)完成成Class對象的鏈鏈接,如如已鏈接接過,則則會直接接返回。JVM的體系結(jié)結(jié)構(gòu)之類類加載器器四、簡單單的classLoader例子/* 重寫寫ClassLo
10、ader類的findClass方法,將將一個字字節(jié)數(shù)組組轉(zhuǎn)換為為Class類的實例例*/publicClassfindClass(Stringname)throwsClassNotFoundExceptionbyteb= null;tryb =loadClassData(AutoClassLoader.FormatClassName(name);catch(Exception e) e.printStackTrace();returndefineClass(name,b,0,b.length);/* 將指指定路徑徑的.class文件轉(zhuǎn)換換成字節(jié)節(jié)數(shù)組*/private byteloadClas
11、sData(Stringfilepath)throws Exceptionintn=0;BufferedInputStream br =newBufferedInputStream(newFileInputStream(newFile(filepath);ByteArrayOutputStreambos=newByteArrayOutputStream();while(n=br.read()!=-1)bos.write(n);br.close();returnbos.toByteArray();JVM的體系結(jié)結(jié)構(gòu)之類類加載器器四、簡單單的classLoader例子 /* 格式式化文件件所對應(yīng)應(yīng)
12、的路徑徑*/publicstatic StringFormatClassName(String name)FILEPATH=DEAFAULTDIR+name+.class;returnFILEPATH;/* main方法測試試*/publicstatic voidmain(Stringargs)throwsException AutoClassLoaderacl =newAutoClassLoader();Classc =acl.findClass(testClass);Objectobj =c.newInstance();Methodm=c.getMethod(getName,newClas
13、sString.class,int.class);m.invoke(obj,你好,123);System.out.println(c.getName();System.out.println(c.getClassLoader();System.out.println(c.getClassLoader().getParent();內(nèi)容JVM的生命周周期JVM的體系結(jié)結(jié)構(gòu)JVM類加載器器JVM執(zhí)行引擎擎JVM運行時數(shù)數(shù)據(jù)區(qū)JVM垃圾回收收問題JVM的體系結(jié)結(jié)構(gòu)之執(zhí)執(zhí)行引擎擎一、JVM通過執(zhí)行行引擎來來完成字字節(jié)碼的的執(zhí)行,在執(zhí)行行過程中中JVM采用的是是自己的的一套指指令系統(tǒng)統(tǒng),每個線程程在創(chuàng)建建
14、后,都都會產(chǎn)生生一個程程序計數(shù)數(shù)器(pc)和棧(Stack),其中中程序計計數(shù)器中中存放了了下一條條將要執(zhí)執(zhí)行的指指令,Stack中存放StackFrame,表示的的為當(dāng)前前正在執(zhí)執(zhí)行的方方法,每每個方法法的執(zhí)行行都會產(chǎn)產(chǎn)生StackFrame,StackFrame中存放了了傳遞給給方法的的參數(shù)、方法內(nèi)內(nèi)的局部部變量以以及操作作數(shù)棧,操作數(shù)數(shù)棧用于于存放指指令運算算的中間間結(jié)果,指令負負責(zé)從操操作數(shù)棧棧中彈出出參與運運算的操操作數(shù),指令執(zhí)執(zhí)行完畢畢后再將將計算結(jié)結(jié)果壓回回到操作作數(shù)棧,當(dāng)方法法執(zhí)行完完畢后則則從Stack中彈出,繼續(xù)其其他方法法的執(zhí)行行。在執(zhí)行方方法時JVM提供了invokes
15、tatic、invokevirtual、invokeinterface和invokespecial四種指令令來執(zhí)行行(1)invokestatic:調(diào)用類類的static方法(2)invokevirtual: 調(diào)用用對象實實例的方方法(3)invokeinterface:將屬性性定義為為接口來來進行調(diào)調(diào)用(4)invokespecial:JVM對于初始始化對象象(Java構(gòu)造器的的方法為為:)以及調(diào)調(diào)用對象象實例中中的私有有方法時時。 JVM的體系結(jié)結(jié)構(gòu)之執(zhí)執(zhí)行引擎擎二、反射射機制是是Java的亮點之之一,基基于反射射可動態(tài)態(tài)調(diào)用某某對象實實例中對對應(yīng)的方方法、訪訪問查看看對象的的屬性等等,而
16、無無需在編編寫代碼碼時就確確定需要要創(chuàng)建的的對象,這使得得Java可以實現(xiàn)現(xiàn)很靈活活的實現(xiàn)現(xiàn)對象的的調(diào)用,代碼示示例如下下:ClassactionClass=Class.forName(外部實現(xiàn)現(xiàn)類);Methodmethod=actionClass.getMethod(“execute”,null);Objectaction=actionClass.newInstance();method.invoke(action,null);反射的關(guān)關(guān)鍵:要要實現(xiàn)動動態(tài)的調(diào)調(diào)用,最最明顯的的方法就就是動態(tài)態(tài)的生成成字節(jié)碼碼,加載載到JVM中并執(zhí)行行 JVM的體系結(jié)結(jié)構(gòu)之執(zhí)執(zhí)行引擎擎(1)Classact
17、ionClass=Class.forName(外部實現(xiàn)現(xiàn)類);調(diào)用本地地方法,使用調(diào)調(diào)用者所所在的ClassLoader來加載創(chuàng)創(chuàng)建出Class對象;(2)Methodmethod=actionClass.getMethod(“execute”,null);校驗此Class是否為public類型的,以確定定類的執(zhí)執(zhí)行權(quán)限限,如不不是public類型的,則直接接拋出SecurityException;調(diào)用privateGetDeclaredMethods來獲取到到此Class中所有的的方法,在privateGetDeclaredMethods對此Class中所有的的方法的的集合做做了緩存存,在第
18、第一次時時會調(diào)用用本地方方法去獲獲??;掃描方法法集合列列表中是是否有相相同方法法名以及及參數(shù)類類型的方方法,如如有則復(fù)復(fù)制生成成一個新新的Method對象返回回;如沒有則則繼續(xù)掃掃描父類類、父接接口中是是否有此此方法,如仍然然沒找到到方法則則拋出NoSuchMethodException;JVM的體系結(jié)結(jié)構(gòu)之執(zhí)執(zhí)行引擎擎(3)Objectaction=actionClass.newInstance();第一步:校驗此此Class是否為public類型,如如權(quán)限不不足則直直接拋出出SecurityException;第二步:如沒有有緩存的的構(gòu)造器器對象,則調(diào)用用本地方方法獲取取到構(gòu)造造器,并并復(fù)
19、制生生成一個個新的構(gòu)構(gòu)造器對對象,放放入緩存存,如沒沒有空構(gòu)構(gòu)造器則則拋出InstantiationException;第三步:校驗構(gòu)構(gòu)造器對對象的權(quán)權(quán)限;第四步:執(zhí)行構(gòu)構(gòu)造器對對象的newInstance方法;構(gòu)構(gòu)造器對對象的newInstance方法判斷斷是否有有緩存的的ConstructorAccessor對象,如如果沒有有則調(diào)用用sun.reflect.ReflectionFactory生成新的的ConstructorAccessor對象;第五步:sun.reflect.ReflectionFactory判斷是否否需要調(diào)調(diào)用本地地代碼,可通過過sun.reflect.noInflati
20、on=true來設(shè)置為為不調(diào)用用本地代代碼,在在不調(diào)用用本地代代碼的情情況下,就轉(zhuǎn)交交給MethodAccessorGenerator來處理了了;第六步:MethodAccessorGenerator中的generate方法根據(jù)據(jù)Java Class格式規(guī)范范生成字字節(jié)碼,字節(jié)碼碼中包括括了ConstructorAccessor對象需要要的newInstance方法,此此newInstance方法對應(yīng)應(yīng)的指令令為invokespecial,所需的的參數(shù)則則從外部部壓入,生成的的Constructor類的名字字以:sun/reflect/GeneratedSerializationConstru
21、ctorAccessor或sun/reflect/GeneratedConstructorAccessor開頭,后后面跟隨隨一個累累計創(chuàng)建建的對象象的次數(shù)數(shù);第七步:在生成成了字節(jié)節(jié)碼后將將其加載載到當(dāng)前前的ClassLoader中,并實實例化,完成ConstructorAccessor對象的創(chuàng)創(chuàng)建過程程,并將將此對象象放入構(gòu)構(gòu)造器對對象的緩緩存中;最后一步步:執(zhí)行行獲取的的constructorAccessor.newInstance,這步和和標(biāo)準(zhǔn)的的方法調(diào)調(diào)用沒有有任何區(qū)區(qū)別。JVM的體系結(jié)結(jié)構(gòu)之執(zhí)執(zhí)行引擎擎(4)method.invoke(action,null);這步執(zhí)行行的過程程和上
22、一一步基本本類似,只是在在生成字字節(jié)碼時時生成的的方法改改為了invoke,其調(diào)用用的目標(biāo)標(biāo)改為了了傳入的的對象的的方法,同時生生成的類類名改為為了:sun/reflect/GeneratedMethodAccessor。注:但是是getMethod是非常耗耗性能的的,一方方面是權(quán)權(quán)限的校校驗,另另外一方方面所有有方法的的掃描以以及Method對象的復(fù)復(fù)制,因因此在使使用反射射調(diào)用多多的系統(tǒng)統(tǒng)中應(yīng)緩緩存getMethod返回的Method對象JVM的體系結(jié)結(jié)構(gòu)之執(zhí)執(zhí)行引擎擎2、執(zhí)行技技術(shù)主要的執(zhí)執(zhí)行技術(shù)術(shù)有:解釋,即即時編譯譯,自適適應(yīng)優(yōu)化化、芯片片級直接接執(zhí)行(1)解釋屬屬于第一一代JVM,
23、(2)即時編編譯JIT屬于第二二代JVM,(3)自適應(yīng)應(yīng)優(yōu)化(目前Sun的HotspotJVM采用這種種技術(shù))則吸取取第一代代JVM和第二代代JVM的經(jīng)驗,采用兩兩者結(jié)合合的方式式(4)自適應(yīng)應(yīng)優(yōu)化:開始對對所有的的代碼都都采取解解釋執(zhí)行行的方式式,并監(jiān)監(jiān)視代碼碼執(zhí)行情情況,然然后對那那些經(jīng)常常調(diào)用的的方法啟啟動一個個后臺線線程,將將其編譯譯為本地地代碼,并進行行仔細優(yōu)優(yōu)化。若若方法不不再頻繁繁使用,則取消消編譯過過的代碼碼,仍對對其進行行解釋執(zhí)執(zhí)行。內(nèi)容JVM的生命周周期JVM的體系結(jié)結(jié)構(gòu)JVM類加載器器JVM執(zhí)行引擎擎JVM運行時數(shù)數(shù)據(jù)區(qū)JVM垃圾回收收問題JVM的體系結(jié)結(jié)構(gòu)之運運行時數(shù)數(shù)
24、據(jù)區(qū)一、JVM在運行時時將數(shù)據(jù)據(jù)劃分為為了6個區(qū)域來來存儲,而不僅僅僅是大大家熟知知的Heap區(qū)域,這這6個區(qū)域圖圖示如下下:JVM的體系結(jié)結(jié)構(gòu)之運運行時數(shù)數(shù)據(jù)區(qū)第一塊:PC寄存器PC寄存器是是用于存存儲每個個線程下下一步將將執(zhí)行的的JVM指令,如如該方法法為native的,則PC寄存器中中不存儲儲任何信信息。第二塊:JVM棧JVM棧是線程程私有的的,每個個線程創(chuàng)創(chuàng)建的同同時都會會創(chuàng)建JVM棧,JVM棧中存放放的為當(dāng)當(dāng)前線程程中局部部基本類類型的變變量(java中定義的的八種基基本類型型:boolean、char、byte、short、int、long、float、double)、部分分的返回
25、回結(jié)果以以及StackFrame,非基本本類型的的對象在在JVM棧上僅存存放一個個指向堆堆上的地地址第三塊:堆(Heap)Heap是大家最最為熟悉悉的區(qū)域域,它是是JVM用來存儲儲對象實實例以及及數(shù)組值值的區(qū)域域,可以以認為Java中所有通通過new創(chuàng)建的對對象的內(nèi)內(nèi)存都在在此分配配,Heap中的對象象的內(nèi)存存需要等等待GC進行回收收。JVM的體系結(jié)結(jié)構(gòu)之運運行時數(shù)數(shù)據(jù)區(qū)JVM將Heap分為NewGeneration和OldGeneration(或Tenured Generation)兩塊來來進行管理理:(1)NewGeneration又稱為新新生代,程序中中新建的的對象都都將分配配到新生生代
26、中,新生代代又由Eden Space和兩塊SurvivorSpace構(gòu)成,可可通過-Xmn參數(shù)來指指定其大大?。?)OldGeneration又稱為舊舊生代,用于存存放程序序中經(jīng)過過幾次垃垃圾回收收還存活活的對象象,例如如緩存的的對象等等,舊生生代所占占用的內(nèi)內(nèi)存大小小即為-Xmx指定的大大小減去去-Xmn指定的大大小。JVM的體系結(jié)結(jié)構(gòu)之運運行時數(shù)數(shù)據(jù)區(qū)對堆的解解釋:(1)堆是JVM中所有線線程共享享的,因因此在其其上進行行對象內(nèi)內(nèi)存的分分配均需需要進行行加鎖,這也導(dǎo)導(dǎo)致了new對象的開開銷是比比較大的的(2)鑒于上上面的原原因,SunHotspotJVM為了提升升對象內(nèi)內(nèi)存分配配的效率率,
27、對于于所創(chuàng)建建的線程程都會分分配一塊塊獨立的的空間,這塊空空間又稱稱為TLAB(ThreadLocalAllocationBuffer),其大大小由JVM根據(jù)運行行的情況況計算而而得,在在TLAB上分配對對象時不不需要加加鎖,因因此JVM在給線程程的對象象分配內(nèi)內(nèi)存時會會盡量的的在TLAB上分配,在這種種情況下下JVM中分配對對象內(nèi)存存的性能能和C基本是一一樣高效效的,但但如果對對象過大大的話則則仍然是是直接使使用堆空空間分配配(3)TLAB僅作用于于新生代代的Eden Space,因此在在編寫Java程序時,通常多多個小的的對象比比大的對對象分配配起來更更加高效效,但這種方方法同時時也帶來來
28、了兩個個問題,一是空空間的浪浪費,二二是對象象內(nèi)存的的回收上上仍然沒沒法做到到像Stack那么高效效,同時時也會增增加回收收時的資資源的消消耗,可可通過在在啟動參參數(shù)上增增加-XX:+PrintTLAB來查看TLAB這塊的使使用情況況。JVM的體系結(jié)結(jié)構(gòu)之運運行時數(shù)數(shù)據(jù)區(qū)第四塊:方法區(qū)區(qū)域(MethodArea)(1)方法區(qū)區(qū)域存放放了所加加載的類類的信息息(名稱稱、修飾飾符等)、類中中的靜態(tài)態(tài)變量、類中定定義為final類型的常常量、類類中的Field信息、類類中的方方法信息息,當(dāng)開開發(fā)人員員在程序序中通過過Class對象中的的getName、isInterface等方法來來獲取信信息時,這
29、些數(shù)數(shù)據(jù)都來來源于方方法區(qū)域域,可見見方法區(qū)區(qū)域的重重要性,同樣,方法區(qū)區(qū)域也是是全局共共享的,在一定定的條件件下它也也會被GC,當(dāng)方法法區(qū)域需需要使用用的內(nèi)存存超過其其允許的的大小時時,會拋拋出OutOfMemory的錯誤信信息。(2)在SunJDK中這塊區(qū)區(qū)域?qū)?yīng)應(yīng)的為PermanetGeneration,又稱為為持久代,默認為為64M,可通過過-XX:PermSize以及-XX:MaxPermSize來指定其其大小。第五塊:運行時時常量池池(Runtime Constant Pool)類似C中的符號號表,存存放的為為類中的的固定的的常量信信息、方方法和Field的引用信信息等,其空間間從
30、方法法區(qū)域中中分配。第六塊:本地方方法堆棧棧(NativeMethod Stacks)JVM采用本地地方法堆堆棧來支支持native方法的執(zhí)執(zhí)行,此此區(qū)域用用于存儲儲每個native方法調(diào)用用的狀態(tài)態(tài)。內(nèi)容JVM的生命周周期JVM的體系結(jié)結(jié)構(gòu)JVM類加載器器JVM執(zhí)行引擎擎JVM運行時數(shù)數(shù)據(jù)區(qū)JVM垃圾回收收問題JVM的體系結(jié)結(jié)構(gòu)之內(nèi)內(nèi)存回收收一、JVM中自動的的對象內(nèi)內(nèi)存回收收機制稱稱為:GC(Garbage Collection)1、GC的基本原原理:為將內(nèi)存存中不再再被使用用的對象象進行回回收,GC中用于回回收內(nèi)存存中不被被使用的的對象的的方法稱稱為收集集器,由由于GC需要消耗耗一些資資
31、源和時時間的,Java在對對象象的生命命周期特特征進行行分析后后,在V 1.2以上的版版本采用用了分代代的方式式來進行行對象的的收集,即按照照新生代代、舊生生代的方方式來對對對象進進行收集集,以盡盡可能的的縮短GC對應(yīng)用造造成的暫暫停(1)對新生生代的對對象的收收集稱為為minorGC,(2)對舊生生代的對對象的收收集稱為為Full GC,(3)程序中中主動調(diào)調(diào)用System.gc()強制執(zhí)行行的GC為Full GC,JVM的體系結(jié)結(jié)構(gòu)之內(nèi)內(nèi)存回收收二、JVM中自動內(nèi)內(nèi)存回收收機制(1)引用計計數(shù)收集集器原理:引用計數(shù)數(shù)是標(biāo)識識Heap中對象狀狀態(tài)最明明顯的一一種方法法,引用用計數(shù)的的方法簡簡單來說說就是對對每一個個對象都都提供一一個關(guān)聯(lián)聯(lián)的引用用計數(shù),以此來來標(biāo)識該該對象是是否被使使用,當(dāng)當(dāng)這個計計數(shù)為零零時,說說明這個個對象已已經(jīng)不再再被
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 灰土施工機械合同范例
- 廚房紙巾售賣合同范例
- 天津濱海汽車工程職業(yè)學(xué)院《新能源材料與器件概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 天津濱海汽車工程職業(yè)學(xué)院《MATLAB及應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 月結(jié)店合同范例
- 工程維修結(jié)束合同范例
- 個人購買車輛合同范例
- 抖音藝人簽約合同范例
- 快遞物流合同范例
- 水泥生產(chǎn)員工合同范例
- 醫(yī)藥行業(yè)合規(guī)培訓(xùn)
- 娛樂行業(yè)虛擬現(xiàn)實主題公園建設(shè)方案
- 公路工程合同糾紛處理與法律適用考核試卷
- 股權(quán)合作協(xié)議范本三篇
- 事故隱患內(nèi)部舉報獎勵制度
- 微信公眾號運營合同三篇
- 齊魯名家 談方論藥智慧樹知到期末考試答案2024年
- 2024年華電甘肅大基地煤電分公司招聘筆試參考題庫含答案解析
- 入團志愿書(2016版本)(可編輯打印標(biāo)準(zhǔn)A4) (1)
- 初中好詞好句好段摘抄
- 路基試驗段成果總結(jié)報告
評論
0/150
提交評論