jprofiler监控工具使用说明_第1页
jprofiler监控工具使用说明_第2页
jprofiler监控工具使用说明_第3页
jprofiler监控工具使用说明_第4页
jprofiler监控工具使用说明_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JProfiler安装部署说明JProfiler是一个全功能的Java剖析工具(profiler),专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存漏失(memoryleaks)、并解决执行绪的问题。它让你得以对heapwalker作资源回收器的rootanalysis,可以轻易找出内存漏失;heap快照(snapshot)模式让未被参照(reference)的对象、稍微被参照的对象、或在终结(finalization)队列的对象都会被移除;整合精灵以便剖析浏览器的Java外挂功能,JProfiler功能很强大,可以监控普通的javaapplication,applet,javawebstart,applicationserver等。除了可以监控本地的程序,还可以对远程服务器上跑的应用进行监控。目前JProfiler最新版本是6.0,由于JProfiler需要注册码,网上找到的资源中windows、linux都破解的只有4.3.2版本,这次就使用这个版本进行说明。最新版下载连接/download/jprofiler/files.phpo一、 安装说明在监控端安装windows版的jprofiler4,在服务器端安装linux版的jprofiler4。windows下安装:点击exe文件进行安装,安装后使用文件中的注册码进行注册linux下服务端安装:直接解压即可二、 配置对javaapplication的监控下面以JProfiler监控远程应用程序为例,来说明对远程应用程序监控的配置方法:一、首先启动JProfiler,出现quickstart对话框,选择Anapplicationonaremotecomputer,next,如下图:

二、有2个选项,onthiscomputer和onaremotecomputer,这里是选择被监控的程序的位置,这里选择onaremotecomputer,同时选择远程机器的类型是windows还是linux等,如下图:三、填写远程机器地址,这里是3,如下图:四、填写远程机器JProfiler的安装地址,我这里是/home/sps/jprofiler4,如下图:五、选择远程机器的java运行环境,这里是sun\1.5.0\hotspot,如下图:六、默认监控端口8849,如下图:七、Waitfor…… 为了在开发环境中获取监控的信息,它将等待远程计算机上的JprofileGUI启动,并和本机建立连接,这种方式比较便于修改jprofiler的配置信息。Don'twaitfor不必等待远程计算机的JprofileGUI先启动和建立连接,立即启动。但

在启动远程应用程序前必须校验当前所配置会话的配置文件。虚拟机参数将参考Jprofile的config文件的路径。Don'twaitfor选择Don'twait,立刻启动。八、选择远程机器读取配置文件的位置,这里是/home/sps/jprofiler4/config,同时手工维护配置文件的改动,选择manual同步。同步方式:Manualsynchronization;copytodiretory;executecommand:提供三种同步方式,这里选择的是第一个手工同步,如下图:九、这里要注意,重点在这里,如果不看清楚这个说明信息,会导致配置失败,需要将里面的信息拷贝出来。Integrationtype:[Genericapplication]SelectedJVM:Sun1.5.0(hotspot)Startupmode:Don'twaitforJProfilerGUI,startupimmediatelyImportant:ThelocalconfigfileC:\DocumentsandSettings\Administrator\.jprofiler4\config.xmlmustbecopiedmanuallyto/home/sps/jprofiler4/configontheremotecomputerwhentheprofilingsettingsarechanged.Pleaseinsert-agentlib:jprofilerti=port=8849,nowait,id=133,config=/home/sps/jprofiler4/config/config.xml-Xbootclasspath/a:/home/sps/jprofiler4/bin/agent.jarintothestartcommandofyourremoteapplicationrightafterthejavacommand.Pleaseadd/home/sps/jprofiler4/bin/linux-x86totheenvironmentvariableLD_LIBRARY_PATH.AremotesessionnamedRemoteapplicationon3willbecreatedthatconnectstoarunninginstanceoftheremoteapplicationthatisstartedwiththemodifiedstartcommand.解释一下:1、 将配置文件config.xml从本机C:/DocumentsandSettings/Administrator/.jprofiler4/拷贝到远程服务器3上的/home/sps/jprofiler4/config/目录下;2、 在java启动脚本中增加下面信息-agentlib:jprofilerti=port=8849,nowait,id=133,config=/home/sps/jprofiler4/config/config.xml-Xbootclasspath/a:/home/sps/jprofiler4/bin/agent.jar,注:在启动脚本中,增加上面信息后,会嵌套启动jprofiler4进程,对性能会有一定的影响,但具体影响程度暂无法评估,所以在不需要监控时,建议对这些脚本进行注释。如:Linux下:SJAVACMD-Did=vgopTool\-cp${CLASSPATH}\-DCONFIG_FILE=${MY_HOME}/cfg/perties\-agentlib:jprofilerti=port=8849,nowait,id=130,config=/home/sps/jprofiler4/config/config.xml-Xbootclasspath/a:/home/sps/jprofiler4/bin/agent.jarcom.mgj.main.MainWindows下:java-classpath../lib/dom4j-1.6.1.jar;"-agentlib:jprofilerti=port=8849,nowait,id=131,config=C:\DocumentsandSettings\Administrator\.jprofiler4\config.xml""-Xbootclasspath/a:C:\ProgramFiles\jprofiler4\bin\agent.jar"com/mgj/main/Main3、/home/sps/jprofiler4/bin/linux-x86加入到环境变量中,变量名称为:LD_LIBRARY_PATH

十、选择yes,finisho这个远程监控的session就建好了,可以马上连接进行监控了,上面配置中还有些其他的选择,可以根据情况进行不同的配置。注意:拷贝config.xml到远程时,必须完成第10步。在第9步的时候config.xml未完成,此时拷贝,会出现session找不到的错误。三、配置对applicationserver的监控下面以JProfiler+Jboss为例,来说明JProfiler对远程applicationserver监控的配置方法:打开JProfiler显示QuickStart对话框:1、选择Anapplicationserver,locallyorremotely,如下图:2、选择服务器点击Next进入“服务器选择”对话框,选择JBoss4.x,如下图3、选择监控目标:本地或远程,本次选择远程,如下图:4、填写监控服务器ip地址,如下图:5、填写监控服务器中jprofiler的安装目录,如下图:6、选择启动脚本点击Next进入“启动脚本选择"对话框,输入JBoss启动脚本(run.bat)的路径,远程的可以将jboss启动脚本(run.sh)下载到本地,然后选择。如下图:7、选择JVM的厂商、版本和模式点击Next进入“JVM选择”对话框,我们选择Sun公司的hotspot1.5.0,如下图:8、输入JProfiler的端口号点击Next进入“JProfiler端口输入”对话框,保持默认不变,如下图:点击Next进入选择页面1、 JBoss是否在连接到JProfiler后再启动2、 不等待JProfiler连接,直接启动这里选择2,只在需要监控时才连接,对jboss运行不产生影响,如下图:10填写linux下jprofiler配置文件的保存路径

11、确认配置点击Next进入“确认配置”对话框,确认配置是否正确,如下图,如果不正确点击Back到相应对话框进行修改。这里要注意几个地方:1、 配置文件的保存路径C:\DocumentsandSettings\Administrator\.jprofiler4\config.xml2、 运行脚本名称:c:\run_jprofiler.sh注意脚本里面的下列代码,就是本次配置新增的JAVA_OPTS="-agentlib:jprofilerti=port=8849,nowait,id=116,config=/home/sps/jprofiler4/config/config.xml-Xbootclasspath/a:/home/sps/jprofiler4/"12、配置完成点击Next进入“完成配置”对话框,点击finish完成配置,配置完成后将本地的配置文件C:\DocumentsandSettings\Administrator\.jprofiler4\config.xml拷贝到linux下放置配置文件的地方,如://home/sps/jprofiler5/config将新生成的jboss启动脚本c:\run_jprofiler.sh拷贝到linux下jboss的bin目录下注:在启动脚本中,增加启动jprofiler4脚本信息,会嵌套启动jprofiler4进程,对性能会有一定的影响,但具体影响程度暂无法评估,所以在不需要监控时,建议对这些脚本进行注释。四、启动监控1、 启动linux下jboss(使用run_jprofiler.sh脚本启动)2、 启动windows下jprofiler选择session/startcenter选择刚才配置的服务器,点击ok,就开始监控了。看下jboss下日志,说明连接成功JProfiler>Listeningonport:8849.JProfiler>Reconnection.Usinglastsettings.

五、主要功能简介1.内存剖析MemoryprofilerJProfiler的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。•所有对象显示类或在状况统计和尺码信息堆上所有对象的包。你可以标记当前值并显示差异值。•记录对象Recordobjects显示类或所有已记录对象的包。你可以标记出当前值并且显示差异值。•分配访问树Allocationcalltree显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件。•分配热点Allocationhotspots显示一个列表,包括方法、类、包或分配已选类的J2EE组件。你可以标注当前值并且显示差异值。对于每个热点都可以显示它的跟踪记录树。

堆遍历Heapwalker在JProfiler的堆遍历器(Heapwalker)中,你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。堆遍历器有五个视图:•类Classes显示所有类和它们的实例。•分配Allocations为所有记录对象显示分配树和分配热点。•索引References为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。还能提供合并输入视图和输出视图的功能。•数据Data为单个对象显示实例和类数据。•时间Time显示一个对已记录对象的解决时间的柱状图。

JProfiler提供不同的方法来记录访问树以优化性能和细节。线程或者线程组以及线程状况可以被所有的视图选择。所有的视图都可以聚集到方法、类、包或J2EE组件等不同层上。CPU视图部分包括:•访问树Calltree显示一个积累的自顶向下的树,树中包含所有在JVM中已记录的访问队列。JDBC,JMS和JNDI服务请求都被注释在请求树中。请求树可以根据Servlet和JSP对URL的不同需要进行拆分。•热点Hotspots显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。该热点可以按照方法请求,JDBC,JMS和JNDI服务请求以及按照URL请求来进行计算。•访问图Callgraph显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。二J5L1园MeirwryvIbv.1®宣e:血皿iVi™.-PraifiinqGuTijWfajidinvThivairilu&nliuii.AllUui?udqnu'upn;MellK)ClECPU二J5L1园MeirwryvIbv.1®宣e:血皿iVi™.-PraifiinqGuTijWfajidinvThivairilu&nliuii.AllUui?udqnu'upn;MellK)ClECPUVMtefeinetJYmIb^vs_LThiuuddulu!^i__iRuraiubli;IlotstfotaCallGiaphCallIi-bcI_ FurihrnikfXGilcnfT^'1nrnvniii.ili<inpurpnncn,Hrinyninruinni<i4.线程剖析Threadprofiler对线程剖析,JProfiler提供以下视图:•线程历史Threadhistory显示一个与线程活动和线程状态在一起的活动时间表。•线程监控Threadmonitor显示一个列表,包括所有的活动线程以及它们目前的活动状况。•死锁探测图表DeadlockDetection显示一个包含了所有在JVM里的死锁图表。•目前使用的监测器Currentmonitoruseage显示目前使用的监测器并且包括它们的关联线程。•历史检测记录Historyusagehistory显示重大的等待事件和阻塞事件的历史记录。•监测使用状态Monitorusagestatistics显示分组监测,线程和监测类的统计监测数据。■如一切Vrniil^r4.lJ昼:血硕成ifPrmfiiinq堂uTuWiiidinv成k|』巽感I。H|袒倒畸|阎邹曷匡A 辂hrnviHMquizBfffhanti■Fidbcrlb\*iKiini! tRn=Ethflr*rsHa司pwvlkfirCPUVH!*.';irTirtadVMtefeinetjymIb^vs_LTTihMdaiwnHa司pwvlkfirCPUVH!*.';irTirtadVMtefeinetjymIb^vs_LTTihMdaiwnTin?ad-;r^read-1Tin?ad-=nrescH■Ruumble« ■■Ruumble« ■DIuLkedI-片叫UOThteBitilild:atvTHrBadmwltorl>fidlDelcl>etecllanurihEniknincilcnf^'1nri-wniii.iii<inpurpnncn,Nrlrvfnimruinin^CuireiHirotiitDiusageMorilloruseyeNs4«y|寿AUlnupri^fiJa|IK1II4卜好PmMng5.VM遥感勘测技术VMtelemetry观察JVM的内部状态,JProfiler提供了不同的遥感勘测视图,如下所示:•堆Heap显示一个堆的使用状况和堆尺寸大小活动时间表。•记录的对象Recordedobjects显示一张关于活动对象与数组的图表的活动时间表。

•垃圾回收Garbagecollector显示一张关于垃圾回收活动的活动时间表。•类Classes显示一个与已装载类的图表的活动时间表。•线程Threads显示一个与动态线程图表的活动时间表。六、实战操作(一)任务目标找出项目中内存增大的原因(二)配置说明操作系统:Windows2003Web容器:Tomcat5.0.23JDK版本:sun1.4.2监控类型:本地Jprofiler安装路径:D:\jprofiler5

Tomcat安装路径:D:\Tomcat5测试项目新建WEB项目test建包cn.test在该包下建类文件TestMain.java和TestBean.javapackagecn.test;publicclassTestBean{Stringname="”;}packagecn.test;importjava.util.ArrayList;publicclassTestMain{publicstaticArrayListlist=newArrayList();//存放对象的容器publicstaticintcounter=0; //作统计用}建测试用的JSP文件initl.jsp、init2.jspInitl.jsp(每次执行都创建1万个TestBean对象)<%@pagelanguage="java"import="cn.test.*"pageEncoding="ISO-8859T"%〉<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"〉<html><head><title>init</title></head><body><%for(inti=0;i<10000;i++){TestBeanb=newTestBean();TestMain.list.add(b);

%>SIZE:<%=TestMain.list.size()%><br/>counter:<%=TestMain.counter++%></body></html>Init2.jsp和init1.jsp一模一样即可(后面有用)。(四) 配置测试用例点击d:\jprofiler5\bin\jprofiler.exe执行菜单Session^IntegrationWizards^NewServerIntegrationCtrl+Alt-O猴NewSessioiii?:Ctrl+Alt-O猴NewSessioiii?:芝前!眼源IntegrationWizards►NewServerIntegration—ConversionWizards:NewRemoteIntegration;;NewAppletIntegration::^£M:iiid^ajE4j/eHe4jProjectIntegrationWWW*赣谴邃笺餐燮卷笺嘉燮ww专&*1遂壬OpenSnapshot•寻泌法逑•国歧埃茨3General:?IDEIntegration%?:三噂电曲苴海hii渝定?立前!顿W曲E'3耘演蜂VMTelemetryViews 猝Pleaseopenaprofilingsessiontovi刖Integrationwizard:阈ApacheTomcat5.xIntegrationwizard:阈ApacheTomcat5.xi.choosewizard ChooseintegratioriM^M^IIEciiLuldIur11riiutc,,, ThiswizardintegratesyourapplicationserverorremoteapplicationwithJProFiler.Choosetheappropriatewizardfromthelistbelow.I i»»««»«»--■••••-----------------------------------------------------------------------------------------------------------------------------------------■■■=„„„„„„

|-:;:■::--;»:■:Ifyourapplicationserverisnotlisted;choose"[Genericapplicationserver]"togetstepbystepinstructionsformanualintegration话ApacheTomcat6.x输ApacheTomcat6.x(withtomcat6.exe)碱ApacheTomcat5.xApacheTomcat5.x(withtomcat5.exe)ApacheTomcat4.x浦ApacheTomcat3.x褊AppleWebObjectsDeveloper5.xBEAWeblogic10.x选择是本地测试还是远程测试:选择tomcat运行的脚本文件:D:\T0mcat5\bin\5tartup.batCancel选择虚拟机的类型:PleaselocatethestartscriptforApacheTomcat5.xbelow.Note:theusualnameofthestartscriptisstartup.batThechosenstartupscriptwillnotbemodified.Anewstartupscriptforprofilingwillbegeneratedinthesamedirectory.1.Choosewizard2,LocalorremoteLocatestartscriptChooseJVMD:\T0mcat5\bin\5tartup.batCancel选择虚拟机的类型:PleaselocatethestartscriptforApacheTomcat5.xbelow.Note:theusualnameofthestartscriptisstartup.batThechosenstartupscriptwillnotbemodified.Anewstartupscriptforprofilingwillbegeneratedinthesamedirectory.1.Choosewizard2,LocalorremoteLocatestartscriptChooseJVMChooseprofilingportChoosestartupmodeCheckmodifications8.FinishedLocatethestartscript选择监控端口:用默认的即可选择Web容器是否和Jprofiler一起运行:默认即可ChoosewizardLocalorremoteLocatestartscriptChooseJVMChoosewizardLocalorremoteLocatestartscriptChooseJVMChooseprofilingportChoosestartupmodeCheckmodificationsFinished配置提示:在“远程控制”的时侯要仔细阅读一下。ChoosewhethertowaitfortheJProfilerGUIPleasechoosewhetheryouwouldlikeyourapplicationservertowaitforaconnectionfromtheJProfilerGUIfrontendbeforestartingup:OWaitforaconnectionfromtheJProfilerGUIForprofilinginadevelopmentenvironment;itisrecommendedtowaitforaconnection;sinceitiseasiertomodifyprofilingsettingsthatway.ODon'twait;startupimmediatelyIfyouchoosenottowait;youhavetoadjustprofilingsettingsinthecreatedsessionbeforestartingyourapplicationserver.TheVMparameterswilldependonthelocationoftheJProfilerconfigfile.Theconfigfilehastobesynchronizedtotheremotecomputerasexplainedinthenextstep.

Startupmode:WaitforJProfilerGUIgeneratedscriptargumentsFromthejavainvocationintheprofilingstartscriptFinishCancelNextliiiHiihii,Attention:IFnecessaryIntegrationtype:ApacheTomcat5mStartscript:D:\Tomcat5\bin\startup.batremovedebuggingargumentsandanyAremotesessionnamedApacheTomcat5.hStartupmode:WaitforJProfilerGUIgeneratedscriptargumentsFromthejavainvocationintheprofilingstartscriptFinishCancelNextliiiHiihii,Attention:IFnecessaryIntegrationtype:ApacheTomcat5mStartscript:D:\Tomcat5\bin\startup.batremovedebuggingargumentsandanyAremotesessionnamedApacheTomcat5.honlocalhostwillbecreatedthatChoosewizardLocalorremoteLocatestartscriptChooseJVMChooseprofilingportChoosestartupmodeCheckmodificationsFinishedAttention:IfyouhavemodifiedthevariableCATALINA_OPT5,.pleasemakesurethatitdoesnotcollidewithJProfiler'smodificationswhichareclearlyindicatedinthestartstheapplicationserverwithprofilingenabledbyinvokingthegeneratedstartscript.Theintegrationwizardhasfinishedcollectingallnecessaryinformationandisnowabouttoexecutetherequiredmodifications.Pleasecheckthesummarybelow.然后选择立即起动,开始运行。点击“OK”,我们可以看到另外一个小窗口出来了:Jprofiler的窗口为:Aggregationlevel:ClassesTotal:49;604ViewFilters:RecordedObjectsAllocdtionCdllTree AllocdtionHot5potsClsssTrm匚kerjavax.management.modelmbean.ModelMBeanAttributelnfo |143java.util.jar.Attributes$Name |141MemoryViewsHeapWalker— org.apache,tomcat,util.http,mapper.Mapper$Wrapperjava.io.ExpiringCache$Entryjava.lang.ref.SoftReferencejava,beans.PropertyDescriptorjava.util.Vectororg.apache,commons,modeler.Attributeinfojava.util.TreeMap$Entryjava.lang,reflect.Constructorjava.util.HashMap$Entry5etorg.apache,naming,resources.FileDirContext$FileResourceA...■243而.|201"|200|184Ii'72"Ii'69"工匣|148I147这样我们就可以进行监控了!(五) 开始测试1. 在IE地址栏中输入:http://localhost/test/init1.jsp,执行一次,我们可以在内存视图中看到cn.test.TestBean对象被创建了10000次:MemoryViews153[arrays]java,lang 弟湍注:注n:注Aggregationlevel:曾到cn.test.TestBean对象被创建了10000次:MemoryViews153[arrays]java,lang 弟湍注:注n:注Aggregationlevel:曾场E ,t已st,TEstB已日泊]切澎java.lang.reflect切澎javax.management切澎jdVdJLl切澎javax.management,modelmbeanO iava.beansHeapWalkerCPUViews■597IApacheToacat5.xonlocalhost(4)2.标记现在的状态,然后再执行initl.jsp和,init2.jsp可以让我们找到哪些类在调用后没有被释放(很重要!!!):遂TakeHeapSnapsho:forSelectionShowAllocationTre^ForSelectionShowAllocationHotSpotsForSelectioiAddSelectionToCkssTracker3闫Show函ShowBytecodf^*MarkCurrentValues艺WW.琬恭艺芝艺芝艺芝艺芝艺芝艺芝艺芝艺芝艺芝艺芝艺;$;Eiii^hgeLivenessMode:;:;►立举遂向滂枝西源每E-cportView白VewSettings查看哪些类被发生了变化:

cn.testMemoryViewscn.test.TestBean红色的变成是发生变化的对象及其数量。我刚才执行了4次initl.jsp和1次init2.jsp,正好产生了50000个TestBean对象,和图示显示的一样。3. 过一会后,按F4键进行垃圾回收。但回收完成后,这些对象依然存在,说明某些地方对这个类的引用没有被释放!4. cn.testMemoryViewscn.test.TestBean红色的变成是发生变化的对象及其数量。我刚才执行了4次initl.jsp和1次init2.jsp,正好产生了50000个TestBean对象,和图示显示的一样。3. 过一会后,按F4键进行垃圾回收。但回收完成后,这些对象依然存在,说明某些地方对这个类的引用没有被释放!4. 找出是哪些地方使用了TestBean类,并且没有释放它们在cn.test.TestBean对象上点击右键选择"TakeHeapSnapshotforSelection”,观察它的heapAggregationlevel:PackagesS-0[arrays]O.java.langO.java.utilO.java.lang.reflectO.javax.managementO.javax.management.modelmbeanO.java.beansO.java.ioO.org.apache.catalina.loaderO.java.lang.reFO.org.apache.tomcat.util.buFO.mons.modelerO.org.apache.tomcat.util.http.mapperO.org.apache.naming.resourcesO.java.util.jarO.org.apache.struts.actionO.sun.reflectO.org.apache.Iog4jO.com.sun.jmx.mbeanserverO.org.apache.catalina.coreIO;880^^■9;181I1;129|791HeapWalkerCPUViewsaThreadViewsVMTelemetryViewsNameMemoryViews499000Selecttheoptionsforthesnapshot:0Selectrecordedobjectsobjects]RecordprimitivedatamemoryCancelreferencedthroughsoft;weakorphantomreferencesYoucanchoosenottorecordprimitivedataofobjectsinordertosaveAllobjectsthatarecompletelyunreferenced;objectsthatareonly;460153137130110Initially;theheapwalkerwillshowonlythoseobjectsthathavebeenrecordedinthedynamicmemoryviewsection.点击“OK”:•金View厦ViewSettingsInstanNameMemoryViews499000Selecttheoptionsforthesnapshot:0Selectrecordedobjectsobjects]Record

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论