问题描述
最近我做.net项目,发现该程序并没有自动释放内存,我想知道如何在.net程序里面有效释放内存呢?或者使用什么数据结构才能有效释放内存呢?请高手指点啊!
解决方案
解决方案二:
.net没有这个问题。所以没有什么数据结构可以解决你的问题,你应该看看你的程序为什么一直在使用着对象。
解决方案三:
.net具有自动垃圾回收机制,会在某一时刻启动帮你对垃圾回收堆的无用数据进行垃圾回收,会被认为是垃圾的对象是那些经CLR检查后认为没有任何栈中的对象或寄存器、WINDOWS句柄等非垃圾回收堆的数据所引用的数据。如果一个垃圾回收堆中的数据仍然可以被该堆外的数据所引用,那这个数据就不会被回收。这样他所占用的内存也不会被释放。从上面,你应该可以看出.net会自动释放的是垃圾回收堆中的数据,但是你如果定义了很多静态数据,这些数据并不是存放在垃圾回收堆中的,因此他们不会被自动释放,他们的释放只有等到应用程序域卸载时才会被释放。垃圾回收器的启动时机受多方面因素影响,如果你了解“代“机制的话,就会知道当0代数据满的时候回发生回收,还有比如系统内存紧张的时候,强制使用GC.Collect的时候等。建议你多检查下你的程序,看看哪些对象一直处于被使用的状态。尤其检查下那些带有refout为类关键字的。
解决方案四:
用类似下面的代码吧,尽可能调用对象的Dispose方法//MyResourceWrapper.csusingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceFinalizableDisposableClass{publicclassMyResourceWrapper:IDisposable{//UsedtodetermineifDispose()//hasalreadybeencalled.privatebooldisposed=false;publicvoidDispose(){//Callourhelpermethod.//Specifying"true"signifiesthat//theobjectusertriggeredthecleanup.CleanUp(true);//Nowsuppressfinialization.GC.SuppressFinalize(this);}privatevoidCleanUp(booldisposing){//Besurewehavenotalreadybeendisposed!if(!this.disposed){//Ifdisposingequalstrue,disposeall//managedresources.if(disposing){//Disposemanagedresources.}//Cleanupunmanagedresourceshere.}disposed=true;}~MyResourceWrapper(){Console.Beep();//Callourhelpermethod.//Specifying"false"signifiesthat//theGCtriggeredthecleanup.CleanUp(false);}}}//Program.csusingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceFinalizableDisposableClass{classProgram{staticvoidMain(string[]args){Console.WriteLine("*****Dispose()/DestructorComboPlatter*****");//CallDispose()manually,thiswillnotcallthedestructor.//CommentouttheDispose()calltohear2beeps.MyResourceWrapperrw=newMyResourceWrapper();rw.Dispose();//Don'tcallDispose(),thiswilltriggerthedestructor//andcauseabeep.MyResourceWrapperrw2=newMyResourceWrapper();}}}
解决方案五:
我是做的C#的Windowsforms程序,然后我在Form1中声明了2个私有成员,用于存储地图的点和线的信息,便于在内存中构建网络,是不是这些数据量太大了,程序管理不过来了呢?
解决方案六:
GC的是.NET中对内存管理的一种功能。垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行。在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。
解决方案七:
GC的是.NET中对内存管理的一种功能。垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行。在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。
解决方案八:
首先,如果你在资源管理器里看你的程序内存占用太多就不顺眼的话,你可以在代码里插入GC.Collect(X),X=0、1、2。这意味着强制垃圾回收器尝试对第X代的对象进行回收。你也可以狠心一点,用GC.Collect(),则强制垃圾回收器尝试对所有的对象进行回收。这样的话,内存占用会有明显的下降。但是在GC.Collect()执行的过程中,程序会停止响应。要说明的是,垃圾回收器自己会决定何时是垃圾回收的最佳时刻。另外,如果程序内存占用过多,物理内存占满,垃圾回收器也会执行回收。过于频繁地执行GC.Collect()是没有意义的。你应该明智地选择时机来执行GC.Collect(),如果你真的想要强制垃圾回收器回收对象的话。
解决方案九:
晕。。原来帖子是两年前的。。。还没结贴啊。。我就接着说吧。。由于垃圾回收的时机的不确定性,以及手工调用GC.Collect()的高开销,你的自定义类可以尝试实现IDisposable接口。在Dispose()方法里,调用本类中其他IDisposable对象的Dispose()方法,销毁非托管对象,以及其他收尾工作(例如ChannelService.Register(channel)后要Unregister)。使用的时候用using(MyClasscla=new...){...}
解决方案十:
引用8楼gqqnb的回复:
晕。。原来帖子是两年前的。。。还没结贴啊。。我就接着说吧。。由于垃圾回收的时机的不确定性,以及手工调用GC.Collect()的高开销,你的自定义类可以尝试实现IDisposable接口。在Dispose()方法里,调用本类中其他IDisposable对象的Dispose()方法,销毁非托管对象,以及其他收尾工作(例如ChannelService.Register(cha……
学习
解决方案十一:
擦,2年前的帖子
解决方案十二:
该回复于2012-01-29 09:17:54被版主删除
解决方案十三:
GC.Collect()可以回收,但是不推荐使用。你懂的
解决方案十四:
哈哈引用10楼xujun5031的回复:
擦,2年前的帖子