资源描述:
《net中托管和非托管的问题》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、在.net编程环境中,系统的资源分为托管资源和非托管资源。对于托管的资源的回收工作,是不需要人工〒预回收的,而1L你也无法干预他们的回收,所能够做的只是丫解.netCLR如何做这些操作。也就是说对于您的应用程序创迚的大多数对象,讨以依靠.NETFramework的垃圾回收器隐式地执行所冇必要的内存筲理任务。资源分力两种,托管•的内存资源,这是不需要我们操心的,系统已经为我们进行管理丫:那么对于非托宵的资源,这甩再芾申一下,就是Stream,数据库的连接,GDI+的相关对象,还有Com对象等等这些资源,需耍我们乎动去释放。对于非托管资源,您在应用程序屮使用完这些非托管资源之后,
2、必须显示的释放他们,例如System.lO.StreamReader的一个文件对象,必须显示的调川对象的Closefl方法关闭它,否则会占川系统的内存和资源,而且可能会出现总想不到的错误。我想说到这里,一定要消楚什么是托管资源,什么是非托锌资源Y?释放。煅常见的-类非托管资源就是包装操作系统资源的对象,例如义件,窗口或网络连接,对于这类资源M然垃圾回收器讨以跟踪封装非托管资源的对象的屯存期,但它不了解具体如何淸理这咚资源。还好.netFramework提供了Finalize()方注,它允许在垃圾冋收器R收该类资源时,适当的淸理非托铃资源。如粜在MSDNLibrary屮搜索Fi
3、nalize将会发现很多类似的主题,这甩列举几种常见的非托管资源:ApplicationContext.Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Timer,Tooltip等等资源。可能在使用的吋候很多都没存注意到!关子托钤资源,就不用说了撒,像简巾的int,string,float,DateTime
4、等等,.net屮超过80°/。的资源都是托钤资源。非托宵资源如何释放,.NETFramework提供Object.nnalize方法,它允许对象在垃圾冋收器冋收该对象使用的内存时适当消理其非托管资源。默认情况下,Finalize方法不执行任何操作。默认情况下,Finalize方法不执行任何操作。如果您要让垃圾回收器在回收对象的内存之前对对象执行消理操作,您必须在类中芾写Finalize力*法。然而人家都可以发现在次际的编程十根本无法override方法FinalizeG,在C#屮,可以通过析构函数自动生成Rnaiize方法和对基类的Finalize方法的调用。例如:-MyCl
5、ass(){//Performsomecleanupoperationshere.}该代码隐式翻译为下而的代码。protectedoverridevoidFinalize(){try{//Performsomecleanupoperationshere.}finally{base.FinalizeO;}}但是,在编程十,并不建议进行override方法Finalized,因力,实现Finalize方法或析构蚋数对性能可能会舟负而影响。一个简维的理由如下:用Finalize方法回收对象使用的内存需要至少两次垃圾回收,当垃圾回收器回收时,它只冋收没冇终结器(Finalize方法)
6、的不可访问的lAl存,这时他不能冋收具有终结器(Finalize方法)的不可以访问的内存。它改为将这些对象的项从终止队列中移除并将他们放肾在标记力“准备终止”的对象列表屮,该列表中的项指向托貧•堆屮准备被调用其终止代码的对象,下次垃圾回收器进行回收时,就回收并释放丫这些内存。C#托管及未托管对象管理C#屮的对象分为值类型和引用类型,二者鉍大的区别在r数裾的存储方式和存储位罝.WINDOWS操作系统使用虚拟寻址系统來宵理程序运行吋产生的数据存放.简单的说,该系统管理犄一个内存区域,在该IX域中划拨出--部分出來专门存放值类型变尕,称为堆栈,堆栈采川先进后出的原则,将值类型变杂从
7、区域的最商地址位开始向低位地址存储,先进后出,后进先出的管理//式保证了仉类型变萤在山了作用域后能即使的消除占川的闪存区域,由于堆栈速度快,所保存的数据-般不太大,这部分一般不需要用户专门操作.伉类型保存在堆栈汇总,堆栈有非常高的性能,但对于所有的变杂来说还足不太灵活。通常我们希望使川一个方法分配内存,來枰储一些数据,并在方法返出后的很长一段时间内数据仍趦可以使用的。只要足川new运筇符來诸求存储空间,就存在这种可能性——例如所有的引用类型。此吋就要使用托管堆。它在垃圾收集器的控制下工作,托管堆(或简称