.net程序中如何有效释放内存?

问题描述

最近我做.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年前的帖子

时间: 2024-10-26 05:08:42

.net程序中如何有效释放内存?的相关文章

Windows 2003中巧妙释放内存资源

经常看到有朋友在论坛上诉苦说需要释放内存,其实如果你安装了 Windows 2003 的话,那么并不需要寻求那些需要注册才能长久使用的第三方内存管理软件.因为Windows 2003已经自带了一个名为Empty.exe的小程序,它可以用来释放某些应用程序在占用大量内存时不能及时释放的那部分资源,与那些第三方软件内存管理软件不同的是,Empty.exe不会强迫系统全部释放资源,而是仅仅释放必要的资源,这样就不会加重硬盘的负担了. Empty.exe的使用相当简单,命令格式如下: Empty.exe

Windows 2003中安全释放内存命令Empty.exe

经常看到有朋友在论坛上诉苦说需要释放内存,其实如果你安装了Windows http://www.aliyun.com/zixun/aggregation/19058.html">2003的话,那么并不需要寻求那些需要注册才能长久使用的第三方内存管理软件.因为Windows 2003已经自带了一个名为Empty.exe的小程序,它可以用来释放某些应用程序在占用大量内存时不能及时释放的那部分资源,与那些第三方软件内存管理软件不同的是, Empty.exe不会强迫系统全部释放资源,而是仅仅释放必

应用程序与驱动程序共享内存问题

问题描述 应用程序与驱动程序共享内存问题 在应用程序中构建一块内存:在驱动程序的DeviceIoControl处理函数中,通过(PUCHAR)MmGetSystemAddressForMdl(Irp->MdlAddress)可以获得该共享内存的地址,但是处理函数调用IoCompleteRequest后,映射关系就结束,这个地址也就不能用了.怎么在驱动程序里一直保存这个内存地址并一直使用呢?求解答. 解决方案 在驱动程序和应用程序间共享内存驱动程序与应用程序之间共享内存驱动程序与应用程序之间共享内

java通过jni获取C++的数组需要释放内存么

问题描述 java通过jni获取C++的数组需要释放内存么 java通过jni获取C++的数组需要释放内存么?因为数组是通过java传进去的,但是在c++中经过一次类型转换所以不知道需不需要在c++中重新释放内存 解决方案 参考: http://blog.csdn.net/jiangwei0910410003/article/details/17653803 解决方案二: 数组要释放吗?从来没有听说过,只要动态申请的内存才需要释放的. 解决方案三: 一般申请与释放的原则是:谁申请.谁释放,如果是

C/S程序中,客户端接收二进制内存流如何释放?急求...

问题描述 C/S程序中,我在客户端接收服务器端发来的MemoryStream数据.定义://获取网络流NetworkStreamnetworkStream=client.GetStream();//将网络流作为二进制读写对象br=newBinaryReader(networkStream);调用线程:privatevoidReceiveData(){stringreceiveString=null;while(isExit==false)//进入循环接收{try{receiveString=br

Java实时应用程序中的内存管理

使用Java的一个主要优点就是无需担心废弃对象,即,让Java运行时负责Java对象的内存管理. 这是通过让Java运行时对不再使用的Java对象进行垃圾收集而实现的. 垃圾收集是一个比较复杂的过程.通常,Java运行时会遍历堆,检查不再被其他对象引用.从而可以安全删除的对象,然而,由于垃圾收集占用CPU周期,所以它可能会影响应用程序代码的执行.即,如果在执行应用程序代码的过程中执行垃圾收集,则应用程序代码的响应时间可能延长.这会导致用户事务延迟的延长.更为糟糕的是,因为用户不知道何时会进行垃圾

解析PHP中的内存管理,PHP动态分配和释放内存

本篇文章是对PHP中的内存管理,PHP动态分配和释放内存进行了详细的分析介绍,需要的朋友参考下   摘要 内存管理对于长期运行的程序,例如服务器守护程序,是相当重要的影响:因此,理解PHP是如何分配与释放内存的对于创建这类程序极为重要.本文将重点探讨PHP的内存管理问题. 一. 内存在PHP中,填充一个字符串变量相当简单,这只需要一个语句"<?php $str = 'hello world '; ?>"即可,并且该字符串能够被自由地修改.拷贝和移动.而在C语言中,尽管你能够

如何在Win2003中安全的释放内存

  经常看到有朋友在论坛上诉苦说需要释放内存,其实如果你安装了Windows 2003的话,那么并不需要寻求那些需要注册才能长久使用的第三方内存管理软件.因为windows 2003已经自带了一个名为Empty.exe的小程序,它可以用来释放某些应用程序在占用大量内存时不能及时释放的那部分资源,与那些第三方软件内存管理软件不同的是, Empty.exe不会强迫系统全部释放资源,而是仅仅释放必要的资源,这样就不会加重硬盘的负担了win7系统下载.   Empty.exe的使用相当简单,命令格式如下

visual studio-有关DLL中申请的内存在外部释放的问题。

问题描述 有关DLL中申请的内存在外部释放的问题. 具体情况是这样的,我有应用程序,调用了一个DLL.在DLL中有一个函数,返回一个字符串指针,使用完了之后在应用程序中释放这个字符串指针. 在应用程序和DLL用同一个版本的VS编译的时候,调用是没有问题的. 当我用VS2010编译的应用程序去调用用VS2013编译的DLL时,在释放这个指针的时候应用程序就崩溃了. 有大婶知道这是怎么回事吗? 解决方案 关于在dll中申请内存,外部释放的问题关于在dll中申请内存,外部释放的问题Dll中开辟内存在外