版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、淘寶技術(shù)大學(xué)淘寶技術(shù)大學(xué) 應(yīng)屆生培訓(xùn)應(yīng)屆生培訓(xùn) JVM工作原理課程組:雷卷課程組:雷卷 小邪小邪 九穆九穆版本:第一版2009年達(dá)到的目標(biāo)n知道Java虛擬機(jī)的生存周期n知道JVM的體系結(jié)構(gòu)n知道JVM體系結(jié)構(gòu)中的各個(gè)部分n能對(duì)JVM有個(gè)大致清晰的了解內(nèi)容nJVM的生命周期nJVM的體系結(jié)構(gòu)nJVM類加載器nJVM執(zhí)行引擎nJVM運(yùn)行時(shí)數(shù)據(jù)區(qū)nJVM垃圾回收n問題JVM的生命周期一、首先分析兩個(gè)概念JVM實(shí)例和JVM執(zhí)行引擎實(shí)例(1)JVM實(shí)例對(duì)應(yīng)了一個(gè)獨(dú)立運(yùn)行的java程序 它是進(jìn)程級(jí)別(2)JVM執(zhí)行引擎實(shí)例則對(duì)應(yīng)了屬于用戶運(yùn)行程序的線程 它是線程級(jí)別的JVM的生命周期二、JVM的生命周期
2、 (1)JVM實(shí)例的誕生 當(dāng)啟動(dòng)一個(gè)Java程序時(shí),一個(gè)JVM實(shí)例就產(chǎn)生了,任何一個(gè)擁有public static void main(String args)函數(shù)的class都可以作為JVM實(shí)例運(yùn)行的起點(diǎn) (2)JVM實(shí)例的運(yùn)行 main()作為該程序初始線程的起點(diǎn),任何其他線程均由該線程啟動(dòng)。JVM內(nèi)部有兩種線程:守護(hù)線程和非守護(hù)線程,main()屬于非守護(hù)線程,守護(hù)線程通常由JVM自己使用,java程序也可以標(biāo)明自己創(chuàng)建的線程是守護(hù)線程。 (3)JVM實(shí)例的消亡 當(dāng)程序中的所有非守護(hù)線程都終止時(shí),JVM才退出;若安全管理器允許,程 序也可以使用Runtime類或者System.exit(
3、)來退出。內(nèi)容nJVM的生命周期nJVM的體系結(jié)構(gòu)nJVM類加載器nJVM執(zhí)行引擎nJVM運(yùn)行時(shí)數(shù)據(jù)區(qū)nJVM垃圾回收n問題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)運(yùn)行時(shí)數(shù)據(jù)區(qū) 方法區(qū),堆,java棧,PC寄存器,本地方法棧內(nèi)容nJVM的生命周期nJVM的體系結(jié)構(gòu)nJVM類加載器nJVM執(zhí)行引擎nJVM運(yùn)行時(shí)數(shù)據(jù)區(qū)nJVM垃圾回收n問題JVM的體系結(jié)構(gòu)之類加載器一、 JVM將整個(gè)類加載過程劃分為了三個(gè)步驟:(1)裝載 裝載過
4、程負(fù)責(zé)找到二進(jìn)制字節(jié)碼并加載至JVM中,JVM通過類名、類所在的包名通過ClassLoader來完成類的加載,同樣,也采用以上三個(gè)元素來標(biāo)識(shí)一個(gè)被加載了的類:類名+包名+ClassLoader實(shí)例ID。(2)鏈接 鏈接過程負(fù)責(zé)對(duì)二進(jìn)制字節(jié)碼的格式進(jìn)行校驗(yàn)、初始化裝載類中的靜態(tài)變量以及解析類中調(diào)用的接口、類。 在完成了校驗(yàn)后,JVM初始化類中的靜態(tài)變量,并將其值賦為默認(rèn)值。 最后一步為對(duì)類中的所有屬性、方法進(jìn)行驗(yàn)證,以確保其需要調(diào)用的屬性、方法存在,以及具備應(yīng)的權(quán)限(例如public、private域權(quán)限等),會(huì)造成NoSuchMethodError、NoSuchFieldError等錯(cuò)誤信息。
5、(3)初始化 初始化過程即為執(zhí)行類中的靜態(tài)初始化代碼、構(gòu)造器代碼以及靜態(tài)屬性的初始化,在四種情況下初始化過程會(huì)被觸發(fā)執(zhí)行: 調(diào)用了new;反射調(diào)用了類中的方法;子類調(diào)用了初始化;JVM啟動(dòng)過程中指定的初始化類。JVM的體系結(jié)構(gòu)之類加載器JVM的體系結(jié)構(gòu)之類加載器一、JVM兩種類裝載器包括:啟動(dòng)類裝載器和用戶自定義類裝載器,啟動(dòng)類裝載器是JVM實(shí)現(xiàn)的一部分,用戶自定義類裝載器則是Java程序的一部分,必須是ClassLoader類的子類。二、 主要分為以下幾類:(1) Bootstrap ClassLoader 這是JVM的根ClassLoader,它是用C+實(shí)現(xiàn)的,JVM啟動(dòng)時(shí)初始化此Clas
6、sLoader,并由此ClassLoader完成$JAVA_HOME中jre/lib/rt.jar(Sun JDK的實(shí)現(xiàn))中所有class文件的加載,這個(gè)jar中包含了java規(guī)范定義的所有接口以及實(shí)現(xiàn)。(2) Extension ClassLoader JVM用此classloader來加載擴(kuò)展功能的一些jar包(3) System ClassLoader JVM用此classloader來加載啟動(dòng)參數(shù)中指定的Classpath中的jar包以及目錄,在Sun JDK中ClassLoader對(duì)應(yīng)的類名為AppClassLoader。(4) User-Defined ClassLoader Us
7、er-DefinedClassLoader是Java開發(fā)人員繼承ClassLoader抽象類自行實(shí)現(xiàn)的ClassLoader,基于自定義的ClassLoader可用于加載非Classpath中的jar以及目錄JVM的體系結(jié)構(gòu)之類加載器三、ClassLoader抽象類提供了幾個(gè)關(guān)鍵的方法:(1)loadClass 此方法負(fù)責(zé)加載指定名字的類,ClassLoader的實(shí)現(xiàn)方法為先從已經(jīng)加載的類中尋找,如沒有則繼續(xù)從parent ClassLoader中尋找,如仍然沒找到,則從System ClassLoader中尋找,最后再調(diào)用findClass方法來尋找,如要改變類的加載順序,則可覆蓋此方法(2
8、)findLoadedClass 此方法負(fù)責(zé)從當(dāng)前ClassLoader實(shí)例對(duì)象的緩存中尋找已加載的類,調(diào)用的為native的方法。(3) findClass 此方法直接拋出ClassNotFoundException,因此需要通過覆蓋loadClass或此方法來以自定義的方式加載相應(yīng)的類。 (4) findSystemClass 此方法負(fù)責(zé)從System ClassLoader中尋找類,如未找到,則繼續(xù)從Bootstrap ClassLoader中尋找,如仍然為找到,則返回null。 (5)defineClass 此方法負(fù)責(zé)將二進(jìn)制的字節(jié)碼轉(zhuǎn)換為Class對(duì)象 (6) resolveClas
9、s 此方法負(fù)責(zé)完成Class對(duì)象的鏈接,如已鏈接過,則會(huì)直接返回。JVM的體系結(jié)構(gòu)之類加載器四、簡單的classLoader例子/* * 重寫ClassLoader類的findClass方法,將一個(gè)字節(jié)數(shù)組轉(zhuǎn)換為 Class 類的實(shí)例 */ public Class findClass(String name) throws ClassNotFoundException byte b = null; try b = loadClassData(AutoClassLoader.FormatClassName(name); catch (Exception e) e.printStackTrace
10、(); return defineClass(name, b, 0, b.length); /* * 將指定路徑的.class文件轉(zhuǎn)換成字節(jié)數(shù)組 */ private byte loadClassData(String filepath) throws Exception int n =0; BufferedInputStream br = new BufferedInputStream(new FileInputStream(new File(filepath); ByteArrayOutputStream bos= new ByteArrayOutputStream(); while(n=
11、br.read()!=-1) bos.write(n); br.close(); return bos.toByteArray(); JVM的體系結(jié)構(gòu)之類加載器四、簡單的classLoader例子 /* * 格式化文件所對(duì)應(yīng)的路徑 */ public static String FormatClassName(String name) FILEPATH= DEAFAULTDIR + name+.class; return FILEPATH; /* * main方法測試 */ public static void main(String args) throws Exception AutoCl
12、assLoader acl = new AutoClassLoader(); Class c = acl.findClass(testClass); Object obj = c.newInstance(); Method m = c.getMethod(getName,new ClassString.class ,int.class); m.invoke(obj,你好,123); System.out.println(c.getName(); System.out.println(c.getClassLoader(); System.out.println(c.getClassLoader(
13、).getParent(); 內(nèi)容nJVM的生命周期nJVM的體系結(jié)構(gòu)nJVM類加載器nJVM執(zhí)行引擎nJVM運(yùn)行時(shí)數(shù)據(jù)區(qū)nJVM垃圾回收n問題JVM的體系結(jié)構(gòu)之執(zhí)行引擎一、JVM通過執(zhí)行引擎來完成字節(jié)碼的執(zhí)行,在執(zhí)行過程中JVM采用的是自己的一套指令系統(tǒng),每個(gè)線程在創(chuàng)建后,都會(huì)產(chǎn)生一個(gè)程序計(jì)數(shù)器(pc)和棧(Stack),其中程序計(jì)數(shù)器中存放了下一條將要執(zhí)行的指令,Stack中存放Stack Frame,表示的為當(dāng)前正在執(zhí)行的方法,每個(gè)方法的執(zhí)行都會(huì)產(chǎn)生Stack Frame,Stack Frame中存放了傳遞給方法的參數(shù)、方法內(nèi)的局部變量以及操作數(shù)棧,操作數(shù)棧用于存放指令運(yùn)算的中間結(jié)果,指
14、令負(fù)責(zé)從操作數(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)造器的方法為:)以及調(diào)用對(duì)象實(shí)例中的私有方法時(shí)。 J
15、VM的體系結(jié)構(gòu)之執(zhí)行引擎二、反射機(jī)制是Java的亮點(diǎn)之一,基于反射可動(dòng)態(tài)調(diào)用某對(duì)象實(shí)例中對(duì)應(yīng)的方法、訪問查看對(duì)象的屬性等,而無需在編寫代碼時(shí)就確定需要?jiǎng)?chuàng)建的對(duì)象,這使得Java可以實(shí)現(xiàn)很靈活的實(shí)現(xiàn)對(duì)象的調(diào)用,代碼示例如下:Class actionClass=Class.forName(外部實(shí)現(xiàn)類);Method method=actionClass.getMethod(“execute”,null);Object action=actionClass.newInstance();method.invoke(action,null);反射的關(guān)鍵:要實(shí)現(xiàn)動(dòng)態(tài)的調(diào)用,最明顯的方法就是動(dòng)態(tài)的生成字節(jié)碼
16、,加載到JVM中并執(zhí)行 JVM的體系結(jié)構(gòu)之執(zhí)行引擎(1)Class actionClass=Class.forName(外部實(shí)現(xiàn)類); 調(diào)用本地方法,使用調(diào)用者所在的ClassLoader來加載創(chuàng)建出Class對(duì)象;(2)Method method=actionClass.getMethod(“execute”,null);校驗(yàn)此Class是否為public類型的,以確定類的執(zhí)行權(quán)限,如不是public類型的,則直接拋出SecurityException;調(diào)用privateGetDeclaredMethods來獲取到此Class中所有的方法,在privateGetDeclaredMethods
17、對(duì)此Class中所有的方法的集合做了緩存,在第一次時(shí)會(huì)調(diào)用本地方法去獲??;掃描方法集合列表中是否有相同方法名以及參數(shù)類型的方法,如有則復(fù)制生成一個(gè)新的Method對(duì)象返回;如沒有則繼續(xù)掃描父類、父接口中是否有此方法,如仍然沒找到方法則拋出NoSuchMethodException;JVM的體系結(jié)構(gòu)之執(zhí)行引擎(3) Object action=actionClass.newInstance(); 第一步:校驗(yàn)此Class是否為public類型,如權(quán)限不足則直接拋出SecurityException; 第二步:如沒有緩存的構(gòu)造器對(duì)象,則調(diào)用本地方法獲取到構(gòu)造器,并復(fù)制生成一個(gè)新的構(gòu)造器對(duì)象,放入緩
18、存,如沒有空構(gòu)造器則拋出InstantiationException; 第三步:校驗(yàn)構(gòu)造器對(duì)象的權(quán)限; 第四步:執(zhí)行構(gòu)造器對(duì)象的newInstance方法;構(gòu)造器對(duì)象的newInstance方法判斷是否有緩存的ConstructorAccessor對(duì)象,如果沒有則調(diào)用sun.reflect.ReflectionFactory生成新的ConstructorAccessor對(duì)象; 第五步:sun.reflect.ReflectionFactory判斷是否需要調(diào)用本地代碼,可通過sun.reflect.noInflation=true來設(shè)置為不調(diào)用本地代碼,在不調(diào)用本地代碼的情況下,就轉(zhuǎn)交給Meth
19、odAccessorGenerator來處理了; 第六步:MethodAccessorGenerator中的generate方法根據(jù)Java Class格式規(guī)范生成字節(jié)碼,字節(jié)碼中包括了ConstructorAccessor對(duì)象需要的newInstance方法,此newInstance方法對(duì)應(yīng)的指令為invokespecial,所需的參數(shù)則從外部壓入,生成的Constructor類的名字以:sun/reflect/GeneratedSerializationConstructorAccessor或sun/reflect/GeneratedConstructorAccessor開頭,后面跟隨一個(gè)
20、累計(jì)創(chuàng)建的對(duì)象的次數(shù); 第七步:在生成了字節(jié)碼后將其加載到當(dāng)前的ClassLoader中,并實(shí)例化,完成ConstructorAccessor對(duì)象的創(chuàng)建過程,并將此對(duì)象放入構(gòu)造器對(duì)象的緩存中; 最后一步:執(zhí)行獲取的constructorAccessor.newInstance,這步和標(biāo)準(zhǔn)的方法調(diào)用沒有任何區(qū)別。JVM的體系結(jié)構(gòu)之執(zhí)行引擎(4) method.invoke(action,null);這步執(zhí)行的過程和上一步基本類似,只是在生成字節(jié)碼時(shí)生成的方法改為了invoke,其調(diào)用的目標(biāo)改為了傳入的對(duì)象的方法,同時(shí)生成的類名改為了:sun/reflect/GeneratedMethodAcce
21、ssor。注:但是getMethod是非常耗性能的,一方面是權(quán)限的校驗(yàn),另外一方面所有方法的掃描以及Method對(duì)象的復(fù)制,因此在使用反射調(diào)用多的系統(tǒng)中應(yīng)緩存getMethod返回的Method對(duì)象JVM的體系結(jié)構(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的經(jīng)驗(yàn),采用兩者結(jié)合的方式 (4)自適應(yīng)優(yōu)化:開始對(duì)所有的代碼都采取解釋執(zhí)行的方式,并監(jiān)視代碼執(zhí)行情況,然后對(duì)那些經(jīng)常調(diào)用的方法啟動(dòng)一
22、個(gè)后臺(tái)線程,將其編譯為本地代碼,并進(jìn)行仔細(xì)優(yōu)化。若方法不再頻繁使用,則取消編譯過的代碼,仍對(duì)其進(jìn)行解釋執(zhí)行。 內(nèi)容nJVM的生命周期nJVM的體系結(jié)構(gòu)nJVM類加載器nJVM執(zhí)行引擎nJVM運(yùn)行時(shí)數(shù)據(jù)區(qū)nJVM垃圾回收n問題JVM的體系結(jié)構(gòu)之運(yùn)行時(shí)數(shù)據(jù)區(qū)一、JVM在運(yùn)行時(shí)將數(shù)據(jù)劃分為了6個(gè)區(qū)域來存儲(chǔ),而不僅僅是大家熟知的Heap區(qū)域,這6個(gè)區(qū)域圖示如下: JVM的體系結(jié)構(gòu)之運(yùn)行時(shí)數(shù)據(jù)區(qū) 第一塊: PC寄存器 PC寄存器是用于存儲(chǔ)每個(gè)線程下一步將執(zhí)行的JVM指令,如該方法為native的,則PC寄存器中不存儲(chǔ)任何信息。 第二塊:JVM棧 JVM棧是線程私有的,每個(gè)線程創(chuàng)建的同時(shí)都會(huì)創(chuàng)建JVM棧,
23、JVM棧中存放的為當(dāng)前線程中局部基本類型的變量(java中定義的八種基本類型:boolean、char、byte、short、int、long、float、double)、部分的返回結(jié)果以及Stack Frame,非基本類型的對(duì)象在JVM棧上僅存放一個(gè)指向堆上的地址 第三塊:堆(Heap) Heap是大家最為熟悉的區(qū)域,它是JVM用來存儲(chǔ)對(duì)象實(shí)例以及數(shù)組值的區(qū)域,可以認(rèn)為Java中所有通過new創(chuàng)建的對(duì)象的內(nèi)存都在此分配,Heap中的對(duì)象的內(nèi)存需要等待GC進(jìn)行回收。 JVM的體系結(jié)構(gòu)之運(yùn)行時(shí)數(shù)據(jù)區(qū) JVM將Heap分為New Generation和Old Generation(或Tenured
24、 Generation)兩塊來進(jìn)行管理:(1)New Generation 又稱為新生代,程序中新建的對(duì)象都將分配到新生代中,新生代又由Eden Space和兩塊Survivor Space構(gòu)成,可通過-Xmn參數(shù)來指定其大小(2) Old Generation 又稱為舊生代,用于存放程序中經(jīng)過幾次垃圾回收還存活的對(duì)象,例如緩存的對(duì)象等,舊生代所占用的內(nèi)存大小即為-Xmx指定的大小減去-Xmn指定的大小。 JVM的體系結(jié)構(gòu)之運(yùn)行時(shí)數(shù)據(jù)區(qū)對(duì)堆的解釋:(1)堆是JVM中所有線程共享的,因此在其上進(jìn)行對(duì)象內(nèi)存的分配均需要進(jìn)行加鎖,這也導(dǎo)致了new對(duì)象的開銷是比較大的(2)鑒于上面的原因,Sun Ho
25、tspot JVM為了提升對(duì)象內(nèi)存分配的效率,對(duì)于所創(chuàng)建的線程都會(huì)分配一塊獨(dú)立的空間,這塊空間又稱為TLAB(Thread Local Allocation Buffer),其大小由JVM根據(jù)運(yùn)行的情況計(jì)算而得,在TLAB上分配對(duì)象時(shí)不需要加鎖,因此JVM在給線程的對(duì)象分配內(nèi)存時(shí)會(huì)盡量的在TLAB上分配,在這種情況下JVM中分配對(duì)象內(nèi)存的性能和C基本是一樣高效的,但如果對(duì)象過大的話則仍然是直接使用堆空間分配 (3)TLAB僅作用于新生代的Eden Space,因此在編寫Java程序時(shí),通常多個(gè)小的對(duì)象比大的對(duì)象分配起來更加高效, 但這種方法同時(shí)也帶來了兩個(gè)問題,一是空間的浪費(fèi),二是對(duì)象內(nèi)存的回
26、收上仍然沒法做到像Stack那么高效,同時(shí)也會(huì)增加回收時(shí)的資源的消耗,可通過在啟動(dòng)參數(shù)上增加-XX:+PrintTLAB來查看TLAB這塊的使用情況。 JVM的體系結(jié)構(gòu)之運(yùn)行時(shí)數(shù)據(jù)區(qū) 第四塊:方法區(qū)域(Method Area) (1)方法區(qū)域存放了所加載的類的信息(名稱、修飾符等)、類中的靜態(tài)變量、類中定義為final類型的常量、類中的Field信息、類中的方法信息,當(dāng)開發(fā)人員在程序中通過Class對(duì)象中的getName、isInterface等方法來獲取信息時(shí),這些數(shù)據(jù)都來源于方法區(qū)域,可見方法區(qū)域的重要性,同樣,方法區(qū)域也是全局共享的,在一定的條件下它也會(huì)被GC,當(dāng)方法區(qū)域需要使用的內(nèi)存超
27、過其允許的大小時(shí),會(huì)拋出OutOfMemory的錯(cuò)誤信息。 (2)在Sun JDK中這塊區(qū)域?qū)?yīng)的為Permanet Generation,又稱為持久代,默認(rèn)為64M,可通過-XX:PermSize以及-XX:MaxPermSize來指定其大小。 第五塊:運(yùn)行時(shí)常量池(Runtime Constant Pool) 類似C中的符號(hào)表,存放的為類中的固定的常量信息、方法和Field的引用信息等,其空間從方法區(qū)域中分配。第六塊:本地方法堆棧(Native Method Stacks) JVM采用本地方法堆棧來支持native方法的執(zhí)行,此區(qū)域用于存儲(chǔ)每個(gè)native方法調(diào)用的狀態(tài)。 內(nèi)容nJVM的生
28、命周期nJVM的體系結(jié)構(gòu)nJVM類加載器nJVM執(zhí)行引擎nJVM運(yùn)行時(shí)數(shù)據(jù)區(qū)nJVM垃圾回收n問題JVM的體系結(jié)構(gòu)之內(nèi)存回收一、 JVM中自動(dòng)的對(duì)象內(nèi)存回收機(jī)制稱為:GC(Garbage Collection)1、 GC的基本原理: 為將內(nèi)存中不再被使用的對(duì)象進(jìn)行回收,GC中用于回收內(nèi)存中不被使用的對(duì)象的方法稱為收集器,由于GC需要消耗一些資源和時(shí)間的,Java在對(duì)對(duì)象的生命周期特征進(jìn)行分析后,在V 1.2以上的版本采用了分代的方式來進(jìn)行對(duì)象的收集,即按照新生代、舊生代的方式來對(duì)對(duì)象進(jìn)行收集,以盡可能的縮短GC對(duì)應(yīng)用造成的暫停 (1)對(duì)新生代的對(duì)象的收集稱為minor GC, (2)對(duì)舊生代的對(duì)象的收集稱為Full GC, (3)程序中主動(dòng)調(diào)用System.gc()強(qiáng)制執(zhí)行的GC為Full GC, JVM的體系結(jié)構(gòu)之內(nèi)存回收二、 JVM中自動(dòng)內(nèi)存回收機(jī)制(1)引用計(jì)數(shù)收集器 原理: 引用計(jì)數(shù)是標(biāo)識(shí)Hea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 屋面防水課件教學(xué)課件
- 2024年度大數(shù)據(jù)中心建設(shè)與運(yùn)維合同
- 2024年度供應(yīng)鏈管理與融資合同
- 2024年度CRM系統(tǒng)升級(jí)合同:增強(qiáng)銷售合同管理功能
- 2024年度5G基站建設(shè)施工合同
- 2024年建筑工程環(huán)保分包合同
- 2024上海市室內(nèi)裝修合同協(xié)議書范本
- 2024年度企業(yè)合規(guī)性檢查與咨詢服務(wù)合同
- 2024年夫妻財(cái)產(chǎn)清算協(xié)議
- 2024天然氣管網(wǎng)運(yùn)營管理合同
- 2023年高中學(xué)業(yè)水平合格考試英語詞匯表完整版(復(fù)習(xí)必背)
- 《英語大字典》word版
- 詢價(jià)單模板模板
- GB/T 14074-2017木材工業(yè)用膠粘劑及其樹脂檢驗(yàn)方法
- 鋼棧橋工程安全檢查和驗(yàn)收
- FDS軟件介紹及實(shí)例應(yīng)用
- 無配重懸挑裝置吊籃施工方案
- 強(qiáng)基計(jì)劃解讀系列課件
- 2022-2023學(xué)年山東省濟(jì)南市高一上學(xué)期期中考試英語試題 Word版含答案
- 《24點(diǎn)大挑戰(zhàn)》教學(xué)-完整版課件
- 胸痛的鑒別診斷與危險(xiǎn)分層課件
評(píng)論
0/150
提交評(píng)論