版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
淘寶技術(shù)大學(xué)應(yīng)屆生培訓(xùn)
JVM工作原理課程組:雷卷
小邪
九穆版本:第一版2009年達到的目標(biāo)知道Java虛擬機的生存周期知道JVM的體系結(jié)構(gòu)知道JVM體系結(jié)構(gòu)中的各個部分能對JVM有個大致清晰的了解內(nèi)容JVM的生命周期JVM的體系結(jié)構(gòu)JVM類加載器JVM執(zhí)行引擎JVM運行時數(shù)據(jù)區(qū)JVM垃圾回收問題JVM的生命周期
一、首先分析兩個概念JVM實例和JVM執(zhí)行引擎實例(1)JVM實例對應(yīng)了一個獨立運行的java程序
它是進程級別(2)JVM執(zhí)行引擎實例則對應(yīng)了屬于用戶運行程序的線程它是線程級別的JVM的生命周期
二、JVM的生命周期
(1)JVM實例的誕生當(dāng)啟動一個Java程序時,一個JVM實例就產(chǎn)生了,任何一個擁有publicstaticvoidmain(String[]args)函數(shù)的class都可以作為JVM實例運行的起點
(2)JVM實例的運行
main()作為該程序初始線程的起點,任何其他線程均由該線程啟動。JVM內(nèi)部有兩種線程:守護線程和非守護線程,main()屬于非守護線程,守護線程通常由JVM自己使用,java程序也可以標(biāo)明自己創(chuàng)建的線程是守護線程。
(3)JVM實例的消亡當(dāng)程序中的所有非守護線程都終止時,JVM才退出;若安全管理器允許,程序也可以使用Runtime類或者System.exit()來退出。
內(nèi)容JVM的生命周期JVM的體系結(jié)構(gòu)JVM類加載器JVM執(zhí)行引擎JVM運行時數(shù)據(jù)區(qū)JVM垃圾回收問題JVM的體系結(jié)構(gòu)
JVM的體系結(jié)構(gòu)一、
JVM的內(nèi)部體系結(jié)構(gòu)分為三部分,(1)類裝載器(ClassLoader)子系統(tǒng)作用:用來裝載.class文件
(2)執(zhí)行引擎
作用:執(zhí)行字節(jié)碼,或者執(zhí)行本地方法
(3)運行時數(shù)據(jù)區(qū)方法區(qū),堆,java棧,PC寄存器,本地方法棧
內(nèi)容JVM的生命周期JVM的體系結(jié)構(gòu)JVM類加載器JVM執(zhí)行引擎JVM運行時數(shù)據(jù)區(qū)JVM垃圾回收問題JVM的體系結(jié)構(gòu)之類加載器一、
JVM將整個類加載過程劃分為了三個步驟:(1)裝載
裝載過程負(fù)責(zé)找到二進制字節(jié)碼并加載至JVM中,JVM通過類名、類所在的包名通過ClassLoader來完成類的加載,同樣,也采用以上三個元素來標(biāo)識一個被加載了的類:類名+包名+ClassLoader實例ID。(2)鏈接鏈接過程負(fù)責(zé)對二進制字節(jié)碼的格式進行校驗、初始化裝載類中的靜態(tài)變量以及解析類中調(diào)用的接口、類。在完成了校驗后,JVM初始化類中的靜態(tài)變量,并將其值賦為默認(rèn)值。最后一步為對類中的所有屬性、方法進行驗證,以確保其需要調(diào)用的屬性、方法存在,以及具備應(yīng)的權(quán)限(例如public、private域權(quán)限等),會造成NoSuchMethodError、NoSuchFieldError等錯誤信息。(3)初始化初始化過程即為執(zhí)行類中的靜態(tài)初始化代碼、構(gòu)造器代碼以及靜態(tài)屬性的初始化,在四種情況下初始化過程會被觸發(fā)執(zhí)行:調(diào)用了new;反射調(diào)用了類中的方法;子類調(diào)用了初始化;JVM啟動過程中指定的初始化類。JVM的體系結(jié)構(gòu)構(gòu)之類加載載器JVM的體系結(jié)構(gòu)構(gòu)之類加載載器一、JVM兩種類裝載載器包括::啟動類裝裝載器和用用戶自定義義類裝載器器,啟動類類裝載器是JVM實現(xiàn)的一部部分,用戶戶自定義類類裝載器則則是Java程序的一部部分,必須須是ClassLoader類的子類。。二、主要要分為以下下幾類:(1)BootstrapClassLoader這是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)ExtensionClassLoaderJVM用此classloader來加載擴展展功能的一一些jar包(3)SystemClassLoaderJVM用此classloader來加載啟動動參數(shù)中指指定的Classpath中的jar包以及目錄錄,在SunJDK中ClassLoader對應(yīng)的類名名為AppClassLoader。(4)User-DefinedClassLoaderUser-DefinedClassLoader是Java開發(fā)人員繼繼承ClassLoader抽象類自行行實現(xiàn)的ClassLoader,基于自定定義的ClassLoader可用于加載載非Classpath中的jar以及目錄JVM的體系結(jié)構(gòu)構(gòu)之類加載載器三、ClassLoader抽象類提供供了幾個關(guān)關(guān)鍵的方法法:(1)loadClass此方法負(fù)責(zé)責(zé)加載指定定名字的類類,ClassLoader的實現(xiàn)方法法為先從已已經(jīng)加載的的類中尋找找,如沒有有則繼續(xù)從從parentClassLoader中尋找,如如仍然沒找找到,則從從SystemClassLoader中尋找,最最后再調(diào)用用findClass方法來尋找找,如要改改變類的加加載順序,,則可覆蓋蓋此方法(2)findLoadedClass此方法負(fù)責(zé)責(zé)從當(dāng)前ClassLoader實例對象的的緩存中尋尋找已加載載的類,調(diào)調(diào)用的為native的方法。(3)findClass此方法直接接拋出ClassNotFoundException,因此需要要通過覆蓋蓋loadClass或此方法來來以自定義義的方式加加載相應(yīng)的的類。(4)findSystemClass此方法負(fù)責(zé)責(zé)從SystemClassLoader中尋找類,,如未找到到,則繼續(xù)續(xù)從BootstrapClassLoader中尋找,如如仍然為找找到,則返返回null。(5)defineClass此方法負(fù)責(zé)責(zé)將二進制制的字節(jié)碼碼轉(zhuǎn)換為Class對象(6)resolveClass此方法負(fù)責(zé)責(zé)完成Class對象的鏈接接,如已鏈鏈接過,則則會直接返返回。JVM的體系結(jié)構(gòu)構(gòu)之類加載載器四、簡單的的classLoader例子/**重寫ClassLoader類的findClass方法,將一一個字節(jié)數(shù)數(shù)組轉(zhuǎn)換為為Class類的實例*/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的體系結(jié)構(gòu)構(gòu)之類加載載器四、簡單的的classLoader例子/**格式化化文件所對對應(yīng)的路徑徑*/publicstaticStringFormatClassName(Stringname){FILEPATH=DEAFAULTDIR+name+".class";returnFILEPATH;}/**main方法測試*/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的體系結(jié)構(gòu)構(gòu)JVM類加載器JVM執(zhí)行引擎JVM運行時數(shù)據(jù)據(jù)區(qū)JVM垃圾回收問題JVM的體系結(jié)構(gòu)構(gòu)之執(zhí)行引引擎一、JVM通過執(zhí)行引引擎來完成成字節(jié)碼的的執(zhí)行,在在執(zhí)行過程程中JVM采用的是自自己的一套套指令系統(tǒng)統(tǒng),每個線程在在創(chuàng)建后,,都會產(chǎn)生生一個程序序計數(shù)器((pc)和棧(Stack),其中程程序計數(shù)器器中存放了了下一條將將要執(zhí)行的的指令,Stack中存放StackFrame,表示的為為當(dāng)前正在在執(zhí)行的方方法,每個個方法的執(zhí)執(zhí)行都會產(chǎn)產(chǎn)生StackFrame,StackFrame中存放了傳傳遞給方法法的參數(shù)、、方法內(nèi)的的局部變量量以及操作作數(shù)棧,操操作數(shù)棧用用于存放指指令運算的的中間結(jié)果果,指令負(fù)負(fù)責(zé)從操作作數(shù)棧中彈彈出參與運運算的操作作數(shù),指令令執(zhí)行完畢畢后再將計計算結(jié)果壓壓回到操作作數(shù)棧,當(dāng)當(dāng)方法執(zhí)行行完畢后則則從Stack中彈出,繼繼續(xù)其他方方法的執(zhí)行行。在執(zhí)行方法法時JVM提供了invokestatic、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)造器的方方法為:<init>)以及調(diào)用用對象實例例中的私有有方法時。。JVM的體系結(jié)構(gòu)構(gòu)之執(zhí)行引引擎二、反射機機制是Java的亮點之一一,基于反反射可動態(tài)態(tài)調(diào)用某對對象實例中中對應(yīng)的方方法、訪問問查看對象象的屬性等等,而無需需在編寫代代碼時就確確定需要創(chuàng)創(chuàng)建的對象象,這使得得Java可以實現(xiàn)很很靈活的實實現(xiàn)對象的的調(diào)用,代代碼示例如如下:ClassactionClass=Class.forName(外部實現(xiàn)類類);Methodmethod=actionClass.getMethod(““execute””,null);Objectaction=actionClass.newInstance();method.invoke(action,null);反射的關(guān)鍵鍵:要實現(xiàn)現(xiàn)動態(tài)的調(diào)調(diào)用,最明明顯的方法法就是動態(tài)態(tài)的生成字字節(jié)碼,加加載到JVM中并執(zhí)行JVM的體系結(jié)構(gòu)構(gòu)之執(zhí)行引引擎(1)ClassactionClass=Class.forName(外部實現(xiàn)類類);調(diào)用本地方方法,使用用調(diào)用者所所在的ClassLoader來加載創(chuàng)建建出Class對象;(2)Methodmethod=actionClass.getMethod(““execute””,null);校驗此Class是否為public類型的,以以確定類的的執(zhí)行權(quán)限限,如不是是public類型的,則則直接拋出出SecurityException;調(diào)用privateGetDeclaredMethods來獲取到此此Class中所有的方方法,在privateGetDeclaredMethods對此Class中所有的方方法的集合合做了緩存存,在第一一次時會調(diào)調(diào)用本地方方法去獲取?。粧呙璺椒狭斜碇兄惺欠裼邢嘞嗤椒约皡?shù)數(shù)類型的方方法,如有有則復(fù)制生生成一個新新的Method對象返回;;如沒有則繼繼續(xù)掃描父父類、父接接口中是否否有此方法法,如仍然然沒找到方方法則拋出出NoSuchMethodException;JVM的體系結(jié)構(gòu)構(gòu)之執(zhí)行引引擎(3)Objectaction=actionClass.newInstance();第一步:校校驗此Class是否為public類型,如權(quán)權(quán)限不足則則直接拋出出SecurityException;第二步:如如沒有緩存存的構(gòu)造器器對象,則則調(diào)用本地地方法獲取取到構(gòu)造器器,并復(fù)制制生成一個個新的構(gòu)造造器對象,,放入緩存存,如沒有有空構(gòu)造器器則拋出InstantiationException;第三步:校校驗構(gòu)造器器對象的權(quán)權(quán)限;第四步:執(zhí)執(zhí)行構(gòu)造器器對象的newInstance方法;構(gòu)造造器對象的的newInstance方法判斷是是否有緩存存的ConstructorAccessor對象,如果果沒有則調(diào)調(diào)用生成新的ConstructorAccessor對象;第五步:判斷是否需需要調(diào)用本本地代碼,,可通過sun.reflect.noInflation=true來設(shè)置為不不調(diào)用本地地代碼,在在不調(diào)用本本地代碼的的情況下,,就轉(zhuǎn)交給給MethodAccessorGenerator來處理了;;第六步:MethodAccessorGenerator中的generate方法根據(jù)JavaClass格式規(guī)范生生成字節(jié)碼碼,字節(jié)碼碼中包括了了ConstructorAccessor對象需要的的newInstance方法,此newInstance方法對應(yīng)的的指令為invokespecial,所需的參參數(shù)則從外外部壓入,,生成的Constructor類的名字以以:sun/reflect/GeneratedSerializationConstructorAccessor或sun/reflect/GeneratedConstructorAccessor開頭,后面面跟隨一個個累計創(chuàng)建建的對象的的次數(shù);第七步:在在生成了字字節(jié)碼后將將其加載到到當(dāng)前的ClassLoader中,并實例例化,完成成ConstructorAccessor對象的創(chuàng)建建過程,并并將此對象象放入構(gòu)造造器對象的的緩存中;;最后一步::執(zhí)行獲取取的constructorAccessor.newInstance,這步和標(biāo)標(biāo)準(zhǔn)的方法法調(diào)用沒有有任何區(qū)別別。JVM的體系結(jié)構(gòu)構(gòu)之執(zhí)行引引擎(4)method.invoke(action,null);這步執(zhí)行的的過程和上上一步基本本類似,只只是在生成成字節(jié)碼時時生成的方方法改為了了invoke,其調(diào)用的的目標(biāo)改為為了傳入的的對象的方方法,同時時生成的類類名改為了了:sun/reflect/GeneratedMethodAccessor。注:但是getMethod是非常耗性性能的,一一方面是權(quán)權(quán)限的校驗驗,另外一一方面所有有方法的掃掃描以及Method對象的復(fù)制制,因此在在使用反射射調(diào)用多的的系統(tǒng)中應(yīng)應(yīng)緩存getMethod返回的Method對象JVM的體系結(jié)構(gòu)構(gòu)之執(zhí)行引引擎2、執(zhí)行技術(shù)術(shù)主要的執(zhí)行行技術(shù)有:解釋,即時時編譯,自自適應(yīng)優(yōu)化化、芯片級級直接執(zhí)行行(1)解釋屬于于第一代JVM,(2)即時編譯譯JIT屬于第二代代JVM,(3)自適應(yīng)優(yōu)優(yōu)化(目前前Sun的HotspotJVM采用這種技技術(shù))則吸吸取第一代代JVM和第二代JVM的經(jīng)驗,采采用兩者結(jié)結(jié)合的方式式(4)自適應(yīng)優(yōu)優(yōu)化:開始始對所有的的代碼都采采取解釋執(zhí)執(zhí)行的方式式,并監(jiān)視視代碼執(zhí)行行情況,然然后對那些些經(jīng)常調(diào)用用的方法啟啟動一個后后臺線程,,將其編譯譯為本地代代碼,并進進行仔細(xì)優(yōu)優(yōu)化。若方方法不再頻頻繁使用,,則取消編編譯過的代代碼,仍對對其進行解解釋執(zhí)行。。內(nèi)容JVM的生命周期期JVM的體系結(jié)構(gòu)構(gòu)JVM類加載器JVM執(zhí)行引擎JVM運行時數(shù)據(jù)據(jù)區(qū)JVM垃圾回收問題JVM的體系結(jié)構(gòu)構(gòu)之運行時時數(shù)據(jù)區(qū)一、JVM在運行時將將數(shù)據(jù)劃分分為了6個區(qū)域來存存儲,而不不僅僅是大大家熟知的的Heap區(qū)域,這6個區(qū)域圖示示如下:JVM的體系結(jié)構(gòu)構(gòu)之運行時時數(shù)據(jù)區(qū)第一塊:PC寄存器PC寄存器是用用于存儲每每個線程下下一步將執(zhí)執(zhí)行的JVM指令,如該該方法為native的,則PC寄存器中不不存儲任何何信息。第二塊:JVM棧JVM棧是線程私私有的,每每個線程創(chuàng)創(chuàng)建的同時時都會創(chuàng)建建JVM棧,JVM棧中存放的的為當(dāng)前線線程中局部部基本類型型的變量((java中定義的八八種基本類類型:boolean、char、byte、short、int、long、float、double)、部分的的返回結(jié)果果以及StackFrame,非基本類類型的對象象在JVM棧上僅存放放一個指向向堆上的地地址第三塊:堆堆(Heap)Heap是大家最為為熟悉的區(qū)區(qū)域,它是是JVM用來存儲對對象實例以以及數(shù)組值值的區(qū)域,,可以認(rèn)為為Java中所有通過過new創(chuàng)建的對象象的內(nèi)存都都在此分配配,Heap中的對象的的內(nèi)存需要要等待GC進行回收。。JVM的體系結(jié)構(gòu)構(gòu)之運行時時數(shù)據(jù)區(qū)JVM將Heap分為NewGeneration和OldGeneration(或TenuredGeneration)兩塊來進行管理::(1)NewGeneration又稱為新生生代,程序序中新建的的對象都將將分配到新新生代中,,新生代又又由EdenSpace和兩塊SurvivorSpace構(gòu)成,可通通過-Xmn參數(shù)來指定定其大小(2)OldGeneration又稱為舊生生代,用于于存放程序序中經(jīng)過幾幾次垃圾回回收還存活活的對象,,例如緩存存的對象等等,舊生代代所占用的的內(nèi)存大小小即為-Xmx指定定的的大大小小減減去去-Xmn指定定的的大大小小。。JVM的體體系系結(jié)結(jié)構(gòu)構(gòu)之之運運行行時時數(shù)數(shù)據(jù)據(jù)區(qū)區(qū)對堆堆的的解解釋釋::(1)堆堆是是JVM中所所有有線線程程共共享享的的,,因因此此在在其其上上進進行行對對象象內(nèi)內(nèi)存存的的分分配配均均需需要要進進行行加加鎖鎖,,這這也也導(dǎo)導(dǎo)致致了了new對象象的的開開銷銷是是比比較較大大的的(2)鑒鑒于于上上面面的的原原因因,,SunHotspotJVM為了了提提升升對對象象內(nèi)內(nèi)存存分分配配的的效效率率,,對對于于所所創(chuàng)創(chuàng)建建的的線線程程都都會會分分配配一一塊塊獨獨立立的的空空間間,,這這塊塊空空間間又又稱稱為為TLAB(ThreadLocalAllocationBuffer),,其其大大小小由由JVM根據(jù)據(jù)運運行行的的情情況況計計算算而而得得,,在在TLAB上分分配配對對象象時時不不需需要要加加鎖鎖,,因因此此JVM在給給線線程程的的對對象象分分配配內(nèi)內(nèi)存存時時會會盡盡量量的的在在TLAB上分分配配,,在在這這種種情情況況下下JVM中分分配配對對象象內(nèi)內(nèi)存存的的性性能能和和C基本本是是一一樣樣高高效效的的,,但但如如果果對對象象過過大大的的話話則則仍仍然然是是直直接接使使用用堆堆空空間間分分配配(3)TLAB僅作作用用于于新新生生代代的的EdenSpace,因因此此在在編編寫寫Java程序序時時,,通通常常多多個個小小的的對對象象比比大大的的對對象象分分配配起起來來更更加加高高效效,,但這這種種方方法法同同時時也也帶帶來來了了兩兩個個問問題題,,一一是是空空間間的的浪浪費費,,二二是是對對象象內(nèi)內(nèi)存存的的回回收收上上仍仍然然沒沒法法做做到到像像Stack那么么高高效效,,同同時時也也會會增增加加回回收收時時的的資資源源的的消消耗耗,,可可通通過過在在啟啟動動參參數(shù)數(shù)上上增增加加-XX:+PrintTLAB來查查看看TLAB這塊塊的的使使用用情情況況。。JVM的體體系系結(jié)結(jié)構(gòu)構(gòu)之之運運行行時時數(shù)數(shù)據(jù)據(jù)區(qū)區(qū)第四四塊塊::方方法法區(qū)區(qū)域域((MethodArea)(1)方方法法區(qū)區(qū)域域存存放放了了所所加加載載的的類類的的信信息息((名名稱稱、、修修飾飾符符等等))、、類類中中的的靜靜態(tài)態(tài)變變量量、、類類中中定定義義為為final類型型的的常常量量、、類類中中的的Field信息息、、類類中中的的方方法法信信息息,,當(dāng)當(dāng)開開發(fā)發(fā)人人員員在在程程序序中中通通過過Class對象象中中的的getName、isInterface等方方法法來來獲獲取取信信息息時時,,這這些些數(shù)數(shù)據(jù)據(jù)都都來來源源于于方方法法區(qū)區(qū)域域,,可可見見方方法法區(qū)區(qū)域域的的重重要要性性,,同同樣樣,,方方法法區(qū)區(qū)域域也也是是全全局局共共享享的的,,在在一一定定的的條條件件下下它它也也會會被被GC,當(dāng)當(dāng)方方法法區(qū)區(qū)域域需需要要使使用用的的內(nèi)內(nèi)存存超超過過其其允允許許的的大大小小時時,,會會拋拋出出OutOfMemory的錯誤信信息。(2)在SunJDK中這塊區(qū)區(qū)域?qū)?yīng)應(yīng)的為PermanetGeneration,又稱為為持久代,默認(rèn)為為64M,可通過過-XX:PermSize以及-XX:MaxPermSize來指定其其大小。。第五塊::運行時時常量池池(RuntimeConstantPool)類似C中的符號號表,存存放的為為類中的的固定的的常量信信息、方方法和Field的引用信信息等,,其空間間從方法法區(qū)域中中分配。。第六塊::本地方方法堆棧棧(NativeMethodStacks)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(GarbageCollection)1、GC的基本原原理:為將內(nèi)存存中不再再被使用用的對象象進行回回收,GC中用于回回收內(nèi)存存中不被被使用的的對象的的方法稱稱為收集集器,由由于GC需要消耗耗一些資資源和時時間的,,Java在對對象象的生命命周期特特征進行行分析后后,在V1.2以上的版版本采用用了分代代的方式式來進行行對象的的收集,,即按照照新生代代、舊生生代的方方式來對對對象進進行收集集,以盡盡可能的的縮短GC對應(yīng)用造造成的暫暫停(1)對新生生代的對對象的收收集稱為為minorGC,(2)對舊生生代的對對象的收收集稱為為FullGC,(3)程序中中主動調(diào)調(diào)用System.gc()強制執(zhí)行行的GC為FullGC,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)不再再被使用用了。優(yōu)點:引用計數(shù)數(shù)的好處處是可以以不用暫暫停應(yīng)用用,當(dāng)計計數(shù)變?yōu)闉榱銜r,,即可將將此對象象的內(nèi)存存空間回回收,但但它需要要給每個個對象附附加一個個關(guān)聯(lián)引引用計數(shù)數(shù)缺點:并且引用用計數(shù)
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年商丘工學(xué)院單招職業(yè)技能考試備考題庫含詳細(xì)答案解析
- 2026年黑龍江幼兒師范高等??茖W(xué)校高職單招職業(yè)適應(yīng)性測試備考題庫及答案詳細(xì)解析
- 2026年南寧學(xué)院高職單招職業(yè)適應(yīng)性測試備考題庫及答案詳細(xì)解析
- 素人種草平臺在美妝行業(yè)的價值與傳聲港服務(wù)模式白皮書
- 2026年北京北大方正軟件職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試備考題庫及答案詳細(xì)解析
- 2026年鄭州黃河護理職業(yè)學(xué)院單招綜合素質(zhì)考試模擬試題含詳細(xì)答案解析
- 2026浙江紹興市諸暨市人民醫(yī)院招聘考試重點題庫及答案解析
- 2026屆河北省棗強中學(xué)高三上學(xué)期1月月考?xì)v史試題(含答案及解析)
- 2026年甘肅省慶陽市市本級新開發(fā)城鎮(zhèn)公益性崗位50個參考考試題庫及答案解析
- 2026年湖南民族職業(yè)學(xué)院單招職業(yè)技能考試參考題庫含詳細(xì)答案解析
- GB/T 46568.1-2025智能儀器儀表可靠性第1部分:可靠性試驗與評估方法
- 幼兒園教育活動座位擺放指南
- 水池土建施工方案
- 2025中好建造(安徽)科技有限公司第二次社會招聘13人筆試考試備考試題及答案解析
- 移動支付安全體系架構(gòu)-洞察與解讀
- 水泵維修安全知識培訓(xùn)課件
- 建筑工程施工安全管理標(biāo)準(zhǔn)及實施方案
- DB43∕T 1358-2017 地質(zhì)災(zāi)害治理工程質(zhì)量驗收規(guī)范
- 軍犬的訓(xùn)練考試題及答案
- 臨床病區(qū)藥品管理試題及答案2025年版
- 2025年計劃員崗位考試題及答案
評論
0/150
提交評論