JAVA虛擬機(jī)工作原理_第1頁(yè)
JAVA虛擬機(jī)工作原理_第2頁(yè)
JAVA虛擬機(jī)工作原理_第3頁(yè)
JAVA虛擬機(jī)工作原理_第4頁(yè)
JAVA虛擬機(jī)工作原理_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

淘寶技術(shù)大學(xué)應(yīng)屆生培訓(xùn)

JVM任務(wù)原理課程組:雷卷小邪九穆版本:第一版2021年到達(dá)的目的知道Java虛擬機(jī)的生存周期知道JVM的體系構(gòu)造知道JVM體系構(gòu)造中的各個(gè)部分能對(duì)JVM有個(gè)大致明晰的了解內(nèi)容JVM的生命周期JVM的體系構(gòu)造JVM類加載器JVM執(zhí)行引擎JVM運(yùn)轉(zhuǎn)時(shí)數(shù)據(jù)區(qū)JVM渣滓回收問題JVM的生命周期

一、首先分析兩個(gè)概念JVM實(shí)例和JVM執(zhí)行引擎實(shí)例〔1〕JVM實(shí)例對(duì)應(yīng)了一個(gè)獨(dú)立運(yùn)轉(zhuǎn)的java程序它是進(jìn)程級(jí)別〔2〕JVM執(zhí)行引擎實(shí)例那么對(duì)應(yīng)了屬于用戶運(yùn)轉(zhuǎn)程序的線程它是線程級(jí)別的JVM的生命周期

二、JVM的生命周期〔1〕JVM實(shí)例的誕生當(dāng)啟動(dòng)一個(gè)Java程序時(shí),一個(gè)JVM實(shí)例就產(chǎn)生了,任何一個(gè)擁有publicstaticvoidmain(String[]args)函數(shù)的class都可以作為JVM實(shí)例運(yùn)轉(zhuǎn)的起點(diǎn)〔2〕JVM實(shí)例的運(yùn)轉(zhuǎn)main()作為該程序初始線程的起點(diǎn),任何其他線程均由該線程啟動(dòng)。JVM內(nèi)部有兩種線程:守護(hù)線程和非守護(hù)線程,main()屬于非守護(hù)線程,守護(hù)線程通常由JVM本人運(yùn)用,java程序也可以標(biāo)明本人創(chuàng)建的線程是守護(hù)線程。

〔3〕JVM實(shí)例的消亡當(dāng)程序中的一切非守護(hù)線程都終止時(shí),JVM才退出;假設(shè)平安管理器允許,程序也可以運(yùn)用Runtime類或者System.exit()來退出。

內(nèi)容JVM的生命周期JVM的體系構(gòu)造JVM類加載器JVM執(zhí)行引擎JVM運(yùn)轉(zhuǎn)時(shí)數(shù)據(jù)區(qū)JVM渣滓回收問題JVM的體系構(gòu)造

JVM的體系構(gòu)造一、JVM的內(nèi)部體系構(gòu)造分為三部分,〔1〕類裝載器〔ClassLoader〕子系統(tǒng)作用:用來裝載.class文件〔2〕執(zhí)行引擎作用:執(zhí)行字節(jié)碼,或者執(zhí)行本地方法

〔3〕運(yùn)轉(zhuǎn)時(shí)數(shù)據(jù)區(qū)方法區(qū),堆,java棧,PC存放器,本地方法棧

內(nèi)容JVM的生命周期JVM的體系構(gòu)造JVM類加載器JVM執(zhí)行引擎JVM運(yùn)轉(zhuǎn)時(shí)數(shù)據(jù)區(qū)JVM渣滓回收問題JVM的體系構(gòu)造之類加載器一、JVM將整個(gè)類加載過程劃分為了三個(gè)步驟:〔1〕裝載裝載過程擔(dān)任找到二進(jìn)制字節(jié)碼并加載至JVM中,JVM經(jīng)過類名、類所在的包名經(jīng)過ClassLoader來完成類的加載,同樣,也采用以上三個(gè)元素來標(biāo)識(shí)一個(gè)被加載了的類:類名+包名+ClassLoader實(shí)例ID?!?〕鏈接鏈接過程擔(dān)任對(duì)二進(jìn)制字節(jié)碼的格式進(jìn)展校驗(yàn)、初始化裝載類中的靜態(tài)變量以及解析類中調(diào)用的接口、類。在完成了校驗(yàn)后,JVM初始化類中的靜態(tài)變量,并將其值賦為默許值。最后一步為對(duì)類中的一切屬性、方法進(jìn)展驗(yàn)證,以確保其需求調(diào)用的屬性、方法存在,以及具備應(yīng)的權(quán)限〔例如public、private域權(quán)限等〕,會(huì)呵斥NoSuchMethodError、NoSuchFieldError等錯(cuò)誤信息。〔3〕初始化初始化過程即為執(zhí)行類中的靜態(tài)初始化代碼、構(gòu)造器代碼以及靜態(tài)屬性的初始化,在四種情況下初始化過程會(huì)被觸發(fā)執(zhí)行:調(diào)用了new;反射調(diào)用了類中的方法;子類調(diào)用了初始化;JVM啟動(dòng)過程中指定的初始化類。JVM的體系構(gòu)造之類加載器JVM的體系構(gòu)造之類加載器一、JVM兩種類裝載器包括:?jiǎn)?dòng)類裝載器和用戶自定義類裝載器,啟動(dòng)類裝載器是JVM實(shí)現(xiàn)的一部分,用戶自定義類裝載器那么是Java程序的一部分,必需是ClassLoader類的子類。二、主要分為以下幾類:(1)BootstrapClassLoader這是JVM的根ClassLoader,它是用C++實(shí)現(xiàn)的,JVM啟動(dòng)時(shí)初始化此ClassLoader,并由此ClassLoader完成$JAVA_HOME中jre/lib/rt.jar〔SunJDK的實(shí)現(xiàn)〕中一切class文件的加載,這個(gè)jar中包含了java規(guī)范定義的一切接口以及實(shí)現(xiàn)。(2)ExtensionClassLoaderJVM用此classloader來加載擴(kuò)展功能的一些jar包(3)SystemClassLoaderJVM用此classloader來加載啟動(dòng)參數(shù)中指定的Classpath中的jar包以及目錄,在SunJDK中ClassLoader對(duì)應(yīng)的類名為AppClassLoader。(4)User-DefinedClassLoaderUser-DefinedClassLoader是Java開發(fā)人員承繼ClassLoader籠統(tǒng)類自行實(shí)現(xiàn)的ClassLoader,基于自定義的ClassLoader可用于加載非Classpath中的jar以及目錄JVM的體系構(gòu)造之類加載器三、ClassLoader籠統(tǒng)類提供了幾個(gè)關(guān)鍵的方法:〔1〕loadClass此方法擔(dān)任加載指定名字的類,ClassLoader的實(shí)現(xiàn)方法為先從曾經(jīng)加載的類中尋覓,如沒有那么繼續(xù)從parentClassLoader中尋覓,如依然沒找到,那么從SystemClassLoader中尋覓,最后再調(diào)用findClass方法來尋覓,如要改動(dòng)類的加載順序,那么可覆蓋此方法〔2〕findLoadedClass此方法擔(dān)任從當(dāng)前ClassLoader實(shí)例對(duì)象的緩存中尋覓已加載的類,調(diào)用的為native的方法?!?〕findClass此方法直接拋出ClassNotFoundException,因此需求經(jīng)過覆蓋loadClass或此方法來以自定義的方式加載相應(yīng)的類。(4)findSystemClass此方法擔(dān)任從SystemClassLoader中尋覓類,如未找到,那么繼續(xù)從BootstrapClassLoader中尋覓,如依然為找到,那么前往null。(5)defineClass此方法擔(dān)任將二進(jìn)制的字節(jié)碼轉(zhuǎn)換為Class對(duì)象(6)resolveClass此方法擔(dān)任完成Class對(duì)象的鏈接,如已鏈接過,那么會(huì)直接前往。

JVM的體系構(gòu)造之類加載器四、簡(jiǎn)單的classLoader例子/**重寫ClassLoader類的findClass方法,將一個(gè)字節(jié)數(shù)組轉(zhuǎn)換為Class類的實(shí)例*/publicClass<?>findClass(Stringname)throwsClassNotFoundException{byte[]b=null;try{b=loadClassData(AutoClassLoader.FormatClassName(name));}catch(Exceptione){e.printStackTrace();}returndefineClass(name,b,0,b.length);}/**將指定途徑的.class文件轉(zhuǎn)換成字節(jié)數(shù)組*/privatebyte[]loadClassData(Stringfilepath)throwsException{intn=0;BufferedInputStreambr=newBufferedInputStream(newFileInputStream(newFile(filepath)));ByteArrayOutputStreambos=newByteArrayOutputStream();while((n=br.read())!=-1){bos.write(n);}br.close();returnbos.toByteArray();}JVM的體系構(gòu)造之類加載器四、簡(jiǎn)單的classLoader例子/**格式化文件所對(duì)應(yīng)的途徑*/publicstaticStringFormatClassName(Stringname){

FILEPATH=DEAFAULTDIR+name+".class";returnFILEPATH;}

/**main方法測(cè)試*/publicstaticvoidmain(String[]args)throwsException{

AutoClassLoaderacl=newAutoClassLoader();Classc=acl.findClass("testClass");Objectobj=c.newInstance();Methodm=c.getMethod("getName",newClass[]{String.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的體系構(gòu)造JVM類加載器JVM執(zhí)行引擎JVM運(yùn)轉(zhuǎn)時(shí)數(shù)據(jù)區(qū)JVM渣滓回收問題JVM的體系構(gòu)造之執(zhí)行引擎一、JVM經(jīng)過執(zhí)行引擎來完成字節(jié)碼的執(zhí)行,在執(zhí)行過程中JVM采用的是本人的一套指令系統(tǒng),每個(gè)線程在創(chuàng)建后,都會(huì)產(chǎn)生一個(gè)程序計(jì)數(shù)器〔pc〕和?!睸tack〕,其中程序計(jì)數(shù)器中存放了下一條將要執(zhí)行的指令,Stack中存放StackFrame,表示的為當(dāng)前正在執(zhí)行的方法,每個(gè)方法的執(zhí)行都會(huì)產(chǎn)生StackFrame,StackFrame中存放了傳送給方法的參數(shù)、方法內(nèi)的部分變量以及操作數(shù)棧,操作數(shù)棧用于存放指令運(yùn)算的中間結(jié)果,指令擔(dān)任從操作數(shù)棧中彈出參與運(yùn)算的操作數(shù),指令執(zhí)行終了后再將計(jì)算結(jié)果壓回到操作數(shù)棧,當(dāng)方法執(zhí)行終了后那么從Stack中彈出,繼續(xù)其他方法的執(zhí)行。在執(zhí)行方法時(shí)JVM提供了invokestatic、invokevirtual、invokeinterface和invokespecial四種指令來執(zhí)行〔1〕invokestatic:調(diào)用類的static方法〔2〕invokevirtual:調(diào)用對(duì)象實(shí)例的方法〔3〕invokeinterface:將屬性定義為接口來進(jìn)展調(diào)用〔4〕invokespecial:JVM對(duì)于初始化對(duì)象〔Java構(gòu)造器的方法為:<init>〕以及調(diào)用對(duì)象實(shí)例中的私有方法時(shí)。

JVM的體系構(gòu)造之執(zhí)行引擎二、反射機(jī)制是Java的亮點(diǎn)之一,基于反射可動(dòng)態(tài)調(diào)用某對(duì)象實(shí)例中對(duì)應(yīng)的方法、訪問查看對(duì)象的屬性等,而無需在編寫代碼時(shí)就確定需求創(chuàng)建的對(duì)象,這使得Java可以實(shí)現(xiàn)很靈敏的實(shí)現(xiàn)對(duì)象的調(diào)用,代碼例如如下:ClassactionClass=Class.forName(外部實(shí)現(xiàn)類);Methodmethod=actionClass.getMethod(“execute〞,null);Objectaction=actionClass.newInstance();method.invoke(action,null);反射的關(guān)鍵:要實(shí)現(xiàn)動(dòng)態(tài)的調(diào)用,最明顯的方法就是動(dòng)態(tài)的生成字節(jié)碼,加載到JVM中并執(zhí)行

JVM的體系構(gòu)造之執(zhí)行引擎〔1〕ClassactionClass=Class.forName(外部實(shí)現(xiàn)類);調(diào)用本地方法,運(yùn)用調(diào)用者所在的ClassLoader來加載創(chuàng)建出Class對(duì)象;〔2〕Methodmethod=actionClass.getMethod(“execute〞,null);校驗(yàn)此Class能否為public類型的,以確定類的執(zhí)行權(quán)限,如不是public類型的,那么直接拋出SecurityException;調(diào)用privateGetDeclaredMethods來獲取到此Class中一切的方法,在privateGetDeclaredMethods對(duì)此Class中一切的方法的集合做了緩存,在第一次時(shí)會(huì)調(diào)用本地方法去獲??;掃描方法集合列表中能否有一樣方法名以及參數(shù)類型的方法,如有那么復(fù)制生成一個(gè)新的Method對(duì)象前往;如沒有那么繼續(xù)掃描父類、父接口中能否有此方法,如依然沒找到方法那么拋出NoSuchMethodException;

JVM的體系構(gòu)造之執(zhí)行引擎〔3〕Objectaction=actionClass.newInstance();第一步:校驗(yàn)此Class能否為public類型,如權(quán)限缺乏那么直接拋出SecurityException;第二步:如沒有緩存的構(gòu)造器對(duì)象,那么調(diào)用本地方法獲取到構(gòu)造器,并復(fù)制生成一個(gè)新的構(gòu)造器對(duì)象,放入緩存,如沒有空構(gòu)造器那么拋出InstantiationException;第三步:校驗(yàn)構(gòu)造器對(duì)象的權(quán)限;第四步:執(zhí)行構(gòu)造器對(duì)象的newInstance方法;構(gòu)造器對(duì)象的newInstance方法判別能否有緩存的ConstructorAccessor對(duì)象,假設(shè)沒有那么調(diào)用sun.reflect.ReflectionFactory生成新的ConstructorAccessor對(duì)象;第五步:sun.reflect.ReflectionFactory判別能否需求調(diào)用本地代碼,可經(jīng)過sun.reflect.noInflation=true來設(shè)置為不調(diào)用本地代碼,在不調(diào)用本地代碼的情況下,就轉(zhuǎn)交給MethodAccessorGenerator來處置了;第六步:MethodAccessorGenerator中的generate方法根據(jù)JavaClass格式規(guī)范生成字節(jié)碼,字節(jié)碼中包括了ConstructorAccessor對(duì)象需求的newInstance方法,此newInstance方法對(duì)應(yīng)的指令為invokespecial,所需的參數(shù)那么從外部壓入,生成的Constructor類的名字以:sun/reflect/GeneratedSerializationConstructorAccessor或sun/reflect/GeneratedConstructorAccessor開頭,后面跟隨一個(gè)累計(jì)創(chuàng)建的對(duì)象的次數(shù);第七步:在生成了字節(jié)碼后將其加載到當(dāng)前的ClassLoader中,并實(shí)例化,完成ConstructorAccessor對(duì)象的創(chuàng)建過程,并將此對(duì)象放入構(gòu)造器對(duì)象的緩存中;最后一步:執(zhí)行獲取的constructorAccessor.newInstance,這步和規(guī)范的方法調(diào)用沒有任何區(qū)別。

JVM的體系構(gòu)造之執(zhí)行引擎〔4〕method.invoke(action,null);這步執(zhí)行的過程和上一步根本類似,只是在生成字節(jié)碼時(shí)生成的方法改為了invoke,其調(diào)用的目的改為了傳入的對(duì)象的方法,同時(shí)生成的類名改為了:sun/reflect/GeneratedMethodAccessor。注:但是getMethod是非常耗性能的,一方面是權(quán)限的校驗(yàn),另外一方面一切方法的掃描以及Method對(duì)象的復(fù)制,因此在運(yùn)用反射調(diào)用多的系統(tǒng)中應(yīng)緩存getMethod前往的Method對(duì)象

JVM的體系構(gòu)造之執(zhí)行引擎2、執(zhí)行技術(shù)主要的執(zhí)行技術(shù)有:解釋,即時(shí)編譯,自順應(yīng)優(yōu)化、芯片級(jí)直接執(zhí)行〔1〕解釋屬于第一代JVM,〔2〕即時(shí)編譯JIT屬于第二代JVM,〔3〕自順應(yīng)優(yōu)化〔目前Sun的HotspotJVM采用這種技術(shù)〕那么汲取第一代JVM和第二代JVM的閱歷,采用兩者結(jié)合的方式

〔4〕自順應(yīng)優(yōu)化:開場(chǎng)對(duì)一切的代碼都采取解釋執(zhí)行的方式,并監(jiān)視代碼執(zhí)行情況,然后對(duì)那些經(jīng)常調(diào)用的方法啟動(dòng)一個(gè)后臺(tái)線程,將其編譯為本地代碼,并進(jìn)展仔細(xì)優(yōu)化。假設(shè)方法不再頻繁運(yùn)用,那么取消編譯過的代碼,仍對(duì)其進(jìn)展解釋執(zhí)行。

內(nèi)容JVM的生命周期JVM的體系構(gòu)造JVM類加載器JVM執(zhí)行引擎JVM運(yùn)轉(zhuǎn)時(shí)數(shù)據(jù)區(qū)JVM渣滓回收問題JVM的體系構(gòu)造之運(yùn)轉(zhuǎn)時(shí)數(shù)據(jù)區(qū)一、JVM在運(yùn)轉(zhuǎn)時(shí)將數(shù)據(jù)劃分為了6個(gè)區(qū)域來存儲(chǔ),而不僅僅是大家熟知的Heap區(qū)域,這6個(gè)區(qū)域圖示如下:

JVM的體系構(gòu)造之運(yùn)轉(zhuǎn)時(shí)數(shù)據(jù)區(qū)第一塊:PC存放器PC存放器是用于存儲(chǔ)每個(gè)線程下一步將執(zhí)行的JVM指令,如該方法為native的,那么PC存放器中不存儲(chǔ)任何信息。第二塊:JVM棧JVM棧是線程私有的,每個(gè)線程創(chuàng)建的同時(shí)都會(huì)創(chuàng)建JVM棧,JVM棧中存放的為當(dāng)前線程中部分根本類型的變量〔java中定義的八種根本類型:boolean、char、byte、short、int、long、float、double〕、部分的前往結(jié)果以及StackFrame,非根本類型的對(duì)象在JVM棧上僅存放一個(gè)指向堆上的地址第三塊:堆〔Heap〕Heap是大家最為熟習(xí)的區(qū)域,它是JVM用來存儲(chǔ)對(duì)象實(shí)例以及數(shù)組值的區(qū)域,可以以為Java中一切經(jīng)過new創(chuàng)建的對(duì)象的內(nèi)存都在此分配,Heap中的對(duì)象的內(nèi)存需求等待GC進(jìn)展回收。

JVM的體系構(gòu)造之運(yùn)轉(zhuǎn)時(shí)數(shù)據(jù)區(qū)JVM將Heap分為NewGeneration和OldGeneration〔或TenuredGeneration〕兩塊來進(jìn)展管理:〔1〕NewGeneration又稱為新生代,程序中新建的對(duì)象都將分配到新生代中,新生代又由EdenSpace和兩塊SurvivorSpace構(gòu)成,可經(jīng)過-Xmn參數(shù)來指定其大小〔2〕OldGeneration又稱為舊生代,用于存放程序中經(jīng)過幾次渣滓回收還存活的對(duì)象,例如緩存的對(duì)象等,舊生代所占用的內(nèi)存大小即為-Xmx指定的大小減去-Xmn指定的大小。

JVM的體系構(gòu)造之運(yùn)轉(zhuǎn)時(shí)數(shù)據(jù)區(qū)對(duì)堆的解釋:〔1〕堆是JVM中一切線程共享的,因此在其上進(jìn)展對(duì)象內(nèi)存的分配均需求進(jìn)展加鎖,這也導(dǎo)致了new對(duì)象的開銷是比較大的〔2〕鑒于上面的緣由,SunHotspotJVM為了提升對(duì)象內(nèi)存分配的效率,對(duì)于所創(chuàng)建的線程都會(huì)分配一塊獨(dú)立的空間,這塊空間又稱為TLAB〔ThreadLocalAllocationBuffer〕,其大小由JVM根據(jù)運(yùn)轉(zhuǎn)的情況計(jì)算而得,在TLAB上分配對(duì)象時(shí)不需求加鎖,因此JVM在給線程的對(duì)象分配內(nèi)存時(shí)會(huì)盡量的在TLAB上分配,在這種情況下JVM中分配對(duì)象內(nèi)存的性能和C根本是一樣高效的,但假設(shè)對(duì)象過大的話那么依然是直接運(yùn)用堆空間分配〔3〕TLAB僅作用于新生代的EdenSpace,因此在編寫Java程序時(shí),通常多個(gè)小的對(duì)象比大的對(duì)象分配起來更加高效,但這種方法同時(shí)也帶來了兩個(gè)問題,一是空間的浪費(fèi),二是對(duì)象內(nèi)存的回收上依然沒法做到像Stack那么高效,同時(shí)也會(huì)添加回收時(shí)的資源的耗費(fèi),可經(jīng)過在啟動(dòng)參數(shù)上添加-XX:+PrintTLAB來查看TLAB這塊的運(yùn)用情況。

JVM的體系構(gòu)造之運(yùn)轉(zhuǎn)時(shí)數(shù)據(jù)區(qū)第四塊:方法區(qū)域〔MethodArea〕〔1〕方法區(qū)域存放了所加載的類的信息〔稱號(hào)、修飾符等〕、類中的靜態(tài)變量、類中定義為final類型的常量、類中的Field信息、類中的方法信息,當(dāng)開發(fā)人員在程序中經(jīng)過Class對(duì)象中的getName、isInterface等方法來獲取信息時(shí),這些數(shù)據(jù)都來源于方法區(qū)域,可見方法區(qū)域的重要性,同樣,方法區(qū)域也是全局共享的,在一定的條件下它也會(huì)被GC,當(dāng)方法區(qū)域需求運(yùn)用的內(nèi)存超越其允許的大小時(shí),會(huì)拋出OutOfMemory的錯(cuò)誤信息?!?〕在SunJDK中這塊區(qū)域?qū)?yīng)的為PermanetGeneration,又稱為耐久代,默以為64M,可經(jīng)過-XX:PermSize以及-XX:MaxPermSize來指定其大小。第五塊:運(yùn)轉(zhuǎn)時(shí)常量池〔RuntimeConstantPool〕類似C中的符號(hào)表,存放的為類中的固定的常量信息、方法和Field的援用信息等,其空間從方法區(qū)域中分配。第六塊:本地方法堆?!睳ativeMethodStacks〕JVM采用本地方法堆棧來支持native方法的執(zhí)行,此區(qū)域用于存儲(chǔ)每個(gè)native方法調(diào)用的形狀。

內(nèi)容JVM的生命周期JVM的體系構(gòu)造JVM類加載器JVM執(zhí)行引擎JVM運(yùn)轉(zhuǎn)時(shí)數(shù)據(jù)區(qū)JVM渣滓回收問題JVM的體系構(gòu)造之內(nèi)存回收一、JVM中自動(dòng)的對(duì)象內(nèi)存回收機(jī)制稱為:GC〔GarbageCollection〕1、GC的根本原理:為將內(nèi)存中不再被運(yùn)用的對(duì)象進(jìn)展回收,GC中用于回收內(nèi)存中不被運(yùn)用的對(duì)象的方法稱為搜集器,由于GC需求耗費(fèi)一些資源和時(shí)間的,Java在對(duì)對(duì)象的生命周期特征進(jìn)展分析后,在V1.2以上的版本采用了分代的方式來進(jìn)展對(duì)象的搜集,即按照新生代、舊生代的方式來對(duì)對(duì)象進(jìn)展搜集,以盡能夠的縮短GC對(duì)運(yùn)用呵斥的暫停〔1〕對(duì)新生代的對(duì)象的搜集稱為minorGC,〔2〕對(duì)舊生代的對(duì)象的搜集稱為FullGC,〔3〕程序中自動(dòng)調(diào)用System.gc()強(qiáng)迫執(zhí)行的GC為FullGC,

JVM的體系構(gòu)造之內(nèi)存回收二、JVM中自動(dòng)內(nèi)存回收機(jī)制〔1〕援用計(jì)數(shù)搜集器原理:援用計(jì)數(shù)是標(biāo)識(shí)Heap中對(duì)象形狀最明顯的一種方法,援用計(jì)數(shù)的方法簡(jiǎn)單來說就是對(duì)每一個(gè)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論