版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第6講-虛擬機(jī)性能監(jiān)控與故障處理工具
之可視化工具軟件工程系潘正軍虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第1頁!主要內(nèi)容大綱JConsole:Java監(jiān)視與管理控制臺(tái)VisualVM:多合一故障處理工具虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第2頁!本節(jié)內(nèi)容引入JDK中除了提供大量的命令行工具外,還有兩個(gè)功能強(qiáng)大的可視化工具:JConsole和VisualVM,這兩個(gè)工具是JDK的正式成員,沒有被貼上“unsupportedandexperimental”的標(biāo)簽。其中JConsole是在JDK1.5時(shí)期就已經(jīng)提供的虛擬機(jī)監(jiān)控工具,而VisualVM在JDK1.6Update7中才首次發(fā)布,現(xiàn)在已經(jīng)成為Sun(Oracle)主力推動(dòng)的多合一故障處理工具,并且已經(jīng)從JDK中分離出來成為可以獨(dú)立發(fā)展的開源項(xiàng)目。為了避免本節(jié)的講解成為對軟件說明文檔的簡單翻譯,準(zhǔn)備了一些代碼樣例,都是特意編寫的“反面教材”。后面將會(huì)使用這兩款工具去監(jiān)控、分析這幾段代碼存在的問題,算是本節(jié)簡單的實(shí)戰(zhàn)分析。讀者可以把在可視化工具觀察到的數(shù)據(jù)、現(xiàn)象,與前面兩章中講解的理論知識(shí)互相印證。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第3頁!一、JConsole:Java監(jiān)視與管理控制臺(tái)JConsole(JavaMonitoringandManagementConsole)是一種基于JMX的可視化監(jiān)視、管理工具。它管理部分的功能是針對JMXMBean進(jìn)行管理,由于MBean可以使用代碼、中間件服務(wù)器的管理控制臺(tái)或者所有符合JMX規(guī)范的軟件進(jìn)行訪問,所以本節(jié)將會(huì)著重介紹JConsole監(jiān)視部分的功能。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第4頁!1.JConsole:啟動(dòng)JConsole從前面的圖可以看出,筆者的機(jī)器現(xiàn)在運(yùn)行了Eclipse和JConsole。雙擊它進(jìn)入JConsole主界面,可以看到主界面里共包括“概述”、“內(nèi)存”、“線程”、“類”、“VM摘要”、“MBean”6個(gè)頁簽,如下圖所示。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第5頁!3.JConsole:案例演示源碼虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第6頁!3.JConsole:案例運(yùn)行可視化結(jié)果虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第7頁!3.JConsole:案例運(yùn)行結(jié)果分析
程序運(yùn)行后,在“內(nèi)存”頁簽中可以看到內(nèi)存池Eden區(qū)的運(yùn)行趨勢呈現(xiàn)折線狀,如上圖所示。而監(jiān)視范圍擴(kuò)大至整個(gè)堆后,會(huì)發(fā)現(xiàn)曲線是一條向上增長的平滑曲線。并且從柱狀圖可以看出,在1000次循環(huán)執(zhí)行結(jié)束,運(yùn)行了System.gc()后,雖然整個(gè)新生代Eden和Survivor區(qū)都基本被清空了,但是代表老年代的柱狀圖仍然保持峰值狀態(tài),說明被填充進(jìn)堆中的數(shù)據(jù)在System.gc()方法執(zhí)行之后仍然存活。筆者的分析到此為止,現(xiàn)提兩個(gè)小問題供讀者思考一下,答案稍后給出。1)虛擬機(jī)啟動(dòng)參數(shù)只限制了Java堆為100MB,沒有指定-Xmn參數(shù),能否從監(jiān)控圖中估計(jì)出新生代有多大?2)為何執(zhí)行了System.gc()之后,上圖可視化結(jié)果中代表老年代的柱狀圖仍然顯示峰值狀態(tài),代碼需要如何調(diào)整才能讓System.gc()回收掉填充到堆中的對象?虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第8頁!4.JConsole:線程監(jiān)控如果上面的“內(nèi)存”頁簽相當(dāng)于可視化的jstat命令的話,“線程”頁簽的功能相當(dāng)于可視化的jstack命令,遇到線程停頓時(shí)可以使用這個(gè)頁簽進(jìn)行監(jiān)控分析。前面講解jstack命令的時(shí)候提到過線程長時(shí)間停頓的主要原因主要有:等待外部資源(數(shù)據(jù)庫連接、網(wǎng)絡(luò)資源、設(shè)備資源等)、死循環(huán)、鎖等待(活鎖和死鎖)。通過下面的代碼清單分別演示一下這幾種情況。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第9頁!4.JConsole:線程監(jiān)控案例演示源碼虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第10頁!4.JConsole:線程監(jiān)控案例-main線程結(jié)果程序運(yùn)行后,首先在“線程”頁簽中選擇main線程,如圖4-7所示。堆棧追蹤顯示BufferedReader在readBytes方法中等待System.in的鍵盤輸入,這時(shí)線程為Runnable狀態(tài),Runnable狀態(tài)的線程會(huì)被分配運(yùn)行時(shí)間,但readBytes方法檢查到流沒有更新時(shí)會(huì)立刻歸還執(zhí)行令牌,這種等待只消耗很小的CPU資源。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第11頁!4.JConsole:線程監(jiān)控案例-testLockThread線程結(jié)果下圖顯示testLockThread線程在等待著lock對象的notify或notifyAll方法的出現(xiàn),線程這時(shí)候處于WAITING狀態(tài),在被喚醒前不會(huì)被分配執(zhí)行時(shí)間。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第12頁!5.JConsole:線程監(jiān)控案例-死鎖演示testLockThread線程正在處于正常的活鎖等待,只要lock對象的notify()或notifyAll()方法被調(diào)用,這個(gè)線程便能激活以繼續(xù)執(zhí)行。下面代碼清單演示了一個(gè)無法再被激活的死鎖等待。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第13頁!5.JConsole:線程監(jiān)控案例-死鎖案例分析這段代碼開了200個(gè)線程去分別計(jì)算1+2以及2+1的值,其實(shí)for循環(huán)是可省略的,兩個(gè)線程也可能會(huì)導(dǎo)致死鎖,不過那樣概率太小,需要嘗試運(yùn)行很多次才能看到效果。一般的話,帶for循環(huán)的版本最多運(yùn)行2~3次就會(huì)遇到線程死鎖,程序無法結(jié)束。造成死鎖的原因是Integer.valueOf()方法基于減少對象創(chuàng)建次數(shù)和節(jié)省內(nèi)存的考慮,[-128,127]之間的數(shù)字會(huì)被緩存,當(dāng)valueOf()方法傳入?yún)?shù)在這個(gè)范圍之內(nèi),將直接返回緩存中的對象。也就是說,代碼中調(diào)用了200次Integer.valueOf()方法一共就只返回了兩個(gè)不同的對象。假如在某個(gè)線程的兩個(gè)synchronized塊之間發(fā)生了一次線程切換,那就會(huì)出現(xiàn)線程A等著被線程B持有的Integer.valueOf(1),線程B又等著被線程A持有的Integer.valueOf(2),結(jié)果出現(xiàn)大家都跑不下去的情景。出現(xiàn)線程死鎖之后,點(diǎn)擊JConsole線程面板的“檢測到死鎖”按鈕,將出現(xiàn)一個(gè)新的“死鎖”頁簽,如圖所示。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第14頁!5.JConsole:線程監(jiān)控案例-死鎖結(jié)果分析運(yùn)行結(jié)果圖中很清晰地顯示了線程Thread-199在等待一個(gè)被線程Thread-149持有Integer對象,而點(diǎn)擊線程Thread-149則顯示它也在等待一個(gè)Integer對象,被線程Thread-89持有,這樣兩個(gè)線程就互相卡住,都不存在等到鎖釋放的希望了。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第15頁!1.VisualVM:VisualVM啟動(dòng)1.打開cmd運(yùn)行jvisualvm2.或者找到j(luò)dk的bin目錄,直接打開jvisualvm虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第16頁!2.VisualVM:VisualVM兼容范圍與插件安裝虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第17頁!2.VisualVM:VisualVM插件安裝安裝完插件,選擇一個(gè)需要監(jiān)視的程序就進(jìn)入程序的主界面了,如下圖所示。根據(jù)讀者選擇安裝插件數(shù)量的不同,看到的頁簽可能和下圖中的有所不同。visualVM主界面示例圖如下:虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第18頁!3.VisualVM使用:VisualVM堆Dump生成方式(一)虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第19頁!3.VisualVM使用:VisualVM堆Dump瀏覽虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第20頁!4.VisualVM:分析程序性能在Profiler頁簽中,VisualVM提供了程序運(yùn)行期間方法級(jí)的CPU執(zhí)行時(shí)間分析以及內(nèi)存分析,做Profiling分析肯定會(huì)對程序運(yùn)行性能有比較大的影響,所以一般不在生產(chǎn)環(huán)境中使用這項(xiàng)功能。要開始分析,先選擇“CPU”和“內(nèi)存”按鈕中的一個(gè),然后切換到應(yīng)用程序中對程序進(jìn)行操作,VisualVM會(huì)記錄到這段時(shí)間中應(yīng)用程序執(zhí)行過的方法。如果是CPU分析,將會(huì)統(tǒng)計(jì)每個(gè)方法的執(zhí)行次數(shù)、執(zhí)行耗時(shí);如果是內(nèi)存分析,則會(huì)統(tǒng)計(jì)每個(gè)方法關(guān)聯(lián)的對象數(shù)以及這些對象所占的空間。分析結(jié)束后,點(diǎn)擊“停止”按鈕結(jié)束監(jiān)控過程,如圖所示。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第21頁!5.VisualVM:BTrace動(dòng)態(tài)日志跟蹤BTrace是一個(gè)很“有趣”的VisualVM插件,本身也是可以獨(dú)立運(yùn)行的程序。它的作用是在不停止目標(biāo)程序運(yùn)行的前提下,通過HotSpot虛擬機(jī)的HotSwap技術(shù)[4]動(dòng)態(tài)加入原本并不存在的調(diào)試代碼。這項(xiàng)功能對實(shí)際生產(chǎn)中的程序很有意義:經(jīng)常遇到程序出現(xiàn)問題,但排查錯(cuò)誤的一些必要信息,譬如方法參數(shù)、返回值等,在開發(fā)時(shí)并沒有打印到日志之中,以至于不得不停掉服務(wù),通過調(diào)試增量來加入日志代碼以解決問題。當(dāng)遇到生產(chǎn)環(huán)境服務(wù)無法隨便停止時(shí),缺一兩句日志導(dǎo)致排錯(cuò)進(jìn)行不下去是一件非常郁悶的事情。在VisualVM中安裝了BTrace插件后,在應(yīng)用程序面板中右鍵點(diǎn)擊要調(diào)試的程序,會(huì)出現(xiàn)“TraceApplication……”菜單,點(diǎn)擊將進(jìn)入BTrace面板。這個(gè)面板里面看起來就像一個(gè)簡單的Java程序開發(fā)環(huán)境,里面還有一小段Java代碼,如圖所示。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第22頁!5.VisualVM:BTrace動(dòng)態(tài)日志跟蹤虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第23頁!5.VisualVM:BTrace動(dòng)態(tài)日志跟蹤案例源碼虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第24頁!5.VisualVM:BTrace動(dòng)態(tài)日志跟蹤案例源碼虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第25頁!5.VisualVM:BTrace動(dòng)態(tài)日志跟蹤案例演示BTrace的用法還有許多,打印調(diào)用堆棧、參數(shù)、返回值只是最基本的應(yīng)用,在它的網(wǎng)站上有使用BTrace進(jìn)行性能監(jiān)視、定位連接泄漏和內(nèi)存泄漏、解決多線程競爭問題等例子,有興趣的讀者可以去相關(guān)網(wǎng)站了解一下。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第26頁!1.JConsole:啟動(dòng)JConsole1.啟動(dòng)JConsole通過JDK/bin目錄下的“jconsole.exe”啟動(dòng)JConsole后,將自動(dòng)搜索出本機(jī)運(yùn)行的所有虛擬機(jī)進(jìn)程,不需要用戶自己再使用jps來查詢了,如圖所示。雙擊選擇其中一個(gè)進(jìn)程即可開始監(jiān)控,也可以使用下面的“遠(yuǎn)程進(jìn)程”功能來連接遠(yuǎn)程服務(wù)器,對遠(yuǎn)程虛擬機(jī)進(jìn)行監(jiān)控。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第27頁!2.JConsole:內(nèi)存監(jiān)控內(nèi)存監(jiān)控“內(nèi)存”頁簽相當(dāng)于可視化的jstat命令,用于監(jiān)視受收集器管理的虛擬機(jī)內(nèi)存(Java堆和永久代)的變化趨勢。我們通過運(yùn)行代碼清單4-8中的代碼來體驗(yàn)一下它的監(jiān)視功能。運(yùn)行時(shí)設(shè)置的虛擬機(jī)參數(shù)為:-Xms100m
-Xmx100m
-XX:+UseSerialGC,這段代碼的作用是以64KB/50毫秒的速度往Java堆中填充數(shù)據(jù),一共填充1000次,使用JConsole的“內(nèi)存”頁簽進(jìn)行監(jiān)視,觀察曲線和柱狀指示圖的變化。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第28頁!3.JConsole:案例演示源碼虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第29頁!3.JConsole:案例運(yùn)行控制臺(tái)結(jié)果虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第30頁!3.JConsole:案例問題答案問題1答案:上圖可視化結(jié)果顯示Eden空間為27328KB,因?yàn)闆]有設(shè)置-XX:SurvivorRadio參數(shù),所以Eden與Survivor空間比例為默認(rèn)值8:1,整個(gè)新生代空間大約為27328KB×125%=34160KB。問題2答案:執(zhí)行完System.gc()之后,空間未能回收是因?yàn)?/p>
List<OOMObject>list對象仍然存活,fillHeap()方法仍然沒有退出,因此list對象在System.gc()執(zhí)行時(shí)仍然處于作用域之內(nèi)。
如果把System.gc()移動(dòng)到fillHeap()方法外調(diào)用就可以回收掉全部內(nèi)存。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第31頁!4.JConsole:線程監(jiān)控案例演示源碼虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第32頁!4.JConsole:線程監(jiān)控案例演示源碼虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第33頁!4.JConsole:線程監(jiān)控案例-testBusyThread線程結(jié)果接著監(jiān)控testBusyThread線程,如下圖所示testBusyThread線程一直在執(zhí)行空循環(huán),從堆棧追蹤中看到一直在MonitoringTest.java代碼的23行停留,23行為:while(true)。這時(shí)候線程為Runnable狀態(tài),而且沒有歸還線程執(zhí)行令牌的動(dòng)作,會(huì)在空循環(huán)上用盡全部執(zhí)行時(shí)間直到線程切換,這種等待會(huì)消耗較多的CPU資源。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第34頁!5.JConsole:線程監(jiān)控案例-死鎖演示testLockThread線程正在處于正常的活鎖等待,只要lock對象的notify()或notifyAll()方法被調(diào)用,這個(gè)線程便能激活以繼續(xù)執(zhí)行。下面代碼清單演示了一個(gè)無法再被激活的死鎖等待。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第35頁!5.JConsole:線程監(jiān)控案例-死鎖演示虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第36頁!5.JConsole:線程監(jiān)控案例-死鎖運(yùn)行結(jié)果虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第37頁!二、VisualVM:多合一故障處理工具VisualVM(All-in-OneJavaTroubleshootingTool)是到目前為止隨JDK發(fā)布的功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序,并且可以預(yù)見在未來一段時(shí)間內(nèi)都是官方主力發(fā)展的虛擬機(jī)故障處理工具。官方在VisualVM的軟件說明中寫上了“All-in-One”的描述字樣,預(yù)示著它除了運(yùn)行監(jiān)視、故障處理外,還提供了很多其他方面的功能。如性能分析(Profiling),VisualVM的性能分析功能甚至比起JProfiler、YourKit等專業(yè)且收費(fèi)的Profiling工具都不會(huì)遜色多少,而且VisualVM的還有一個(gè)很大的優(yōu)點(diǎn):不需要被監(jiān)視的程序基于特殊Agent運(yùn)行,因此它對應(yīng)用程序的實(shí)際性能的影響很小,使得它可以直接應(yīng)用在生產(chǎn)環(huán)境中。這個(gè)優(yōu)點(diǎn)是JProfiler、YourKit等工具無法與之媲美的。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第38頁!2.VisualVM:VisualVM兼容范圍與插件安裝虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第39頁!2.VisualVM:VisualVM插件安裝使用VisualVM的自動(dòng)安裝功能已經(jīng)可以找到大多數(shù)所需的插件,在有網(wǎng)絡(luò)連接的環(huán)境下,點(diǎn)擊“工具”→“插件菜單”,彈出如圖所示的插件頁簽,在頁簽的“可用插件”中列舉了當(dāng)前版本VisualVM可以使用的插件,選中插件后在右邊窗口將顯示這個(gè)插件的基本信息,如開發(fā)者、版本、功能描述等。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第40頁!3.VisualVM使用:生成、瀏覽堆轉(zhuǎn)儲(chǔ)快照VisualVM中“概述”、“監(jiān)視”、“線程”、“MBeans”的功能與前面介紹的JConsole差別不大,讀者根據(jù)上文內(nèi)容類比使用即可,下面挑選幾個(gè)特色功能、插件進(jìn)行介紹。在VisualVM中生成dump文件有兩種方式,可以執(zhí)行下列任一操作:1.在“應(yīng)用程序”窗口中右鍵單擊應(yīng)用程序節(jié)點(diǎn),然后選擇“堆Dump”。2.在“應(yīng)用程序”窗口中雙擊應(yīng)用程序節(jié)點(diǎn)以打開應(yīng)用程序標(biāo)簽,然后在“監(jiān)視”標(biāo)簽中單擊“堆Dump”。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第41頁!3.VisualVM使用:VisualVM堆Dump生成方式(二)虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第42頁!3.VisualVM使用:VisualVM堆Dump瀏覽從堆頁簽中的“摘要”面板可以看到應(yīng)用程序dump時(shí)的運(yùn)行時(shí)參數(shù)、System.getProperties()的內(nèi)容、線程堆棧等信息,“類”面板則是以類為統(tǒng)計(jì)口徑統(tǒng)計(jì)類的實(shí)例數(shù)量、容量信息,“實(shí)例”面板不能直接使用,因?yàn)椴荒艽_定用戶想查看哪個(gè)類的實(shí)例,所以需要通過“類”面板進(jìn)入,在“類”中選擇一個(gè)關(guān)心的類后雙擊鼠標(biāo),即可在“實(shí)例”里面看見此類中500個(gè)實(shí)例的具體屬性信息。“OQL控制臺(tái)”面板中就是運(yùn)行OQL查詢語句的,同jhat中介紹的OQL功能一樣。如果需要了解具體OQL語法和使用,可參見本書附錄D的內(nèi)容。虛擬機(jī)性能監(jiān)控與故障處理工具之可視化工具共49頁,您現(xiàn)在瀏覽的是第43頁!
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年九江職業(yè)大學(xué)單招綜合素質(zhì)筆試備考題庫含詳細(xì)答案解析
- 2026年景德鎮(zhèn)藝術(shù)職業(yè)大學(xué)單招綜合素質(zhì)考試備考題庫含詳細(xì)答案解析
- 2026年安徽機(jī)電職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試模擬試題含詳細(xì)答案解析
- 2026年廣東舞蹈戲劇職業(yè)學(xué)院單招綜合素質(zhì)考試參考題庫含詳細(xì)答案解析
- 2026年青島濱海學(xué)院單招綜合素質(zhì)筆試備考題庫含詳細(xì)答案解析
- 2026年江西交通職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試備考題庫含詳細(xì)答案解析
- 2026年南開大學(xué)濱海學(xué)院高職單招職業(yè)適應(yīng)性測試備考題庫及答案詳細(xì)解析
- 2026年深圳信息職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試備考試題及答案詳細(xì)解析
- 2026年江陰職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試備考試題含詳細(xì)答案解析
- 2026年南充科技職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試備考試題及答案詳細(xì)解析
- 2026中俄數(shù)字經(jīng)濟(jì)研究中心(廈門市人工智能創(chuàng)新中心)多崗位招聘備考題庫及1套完整答案詳解
- 主動(dòng)防護(hù)網(wǎng)系統(tǒng)驗(yàn)收方案
- 2026云南保山電力股份有限公司校園招聘50人筆試參考題庫及答案解析
- 《智能網(wǎng)聯(lián)汽車先進(jìn)駕駛輔助技術(shù)》課件 項(xiàng)目1 先進(jìn)駕駛輔助系統(tǒng)的認(rèn)知
- 2025河南中原再擔(dān)保集團(tuán)股份有限公司社會(huì)招聘9人考試參考題庫及答案解析
- 面向?qū)ο笙到y(tǒng)分析與設(shè)計(jì)(MOOC版)全套教學(xué)課件
- DLT-循環(huán)流化床鍋爐停(備)用維護(hù)保養(yǎng)導(dǎo)則
- JT-T-1248-2019營運(yùn)貨車能效和二氧化碳排放強(qiáng)度等級(jí)及評(píng)定方法
- 人教PEP英語六年級(jí)下冊全冊教案教學(xué)設(shè)計(jì)及教學(xué)反思
- 語文七年級(jí)下字帖打印版
- 08年常德地理會(huì)考試卷及答案
評(píng)論
0/150
提交評(píng)論