我发现,在使用
GC.Collect();
GC.WaitForPendingFinalizers();
后,在任务管理器中看到内存回收胜少!原来40多M,回收后还是40多M!
但当我最小化窗口后内存一般会减少到2M左右。
再还原窗口后,内存占用也只有8M多。问题就来啦!.Net是不是在我们最小化窗口时作了什么手脚?把内存回收了?我们自己调用GC.Collect()为什么回收不了那部分内存而最小化可以做到?
GC.Collect();
GC.WaitForPendingFinalizers();
后,在任务管理器中看到内存回收胜少!原来40多M,回收后还是40多M!
但当我最小化窗口后内存一般会减少到2M左右。
再还原窗口后,内存占用也只有8M多。问题就来啦!.Net是不是在我们最小化窗口时作了什么手脚?把内存回收了?我们自己调用GC.Collect()为什么回收不了那部分内存而最小化可以做到?
解决方案 »
- System.IndexOutOfRangeException: 索引超出了数组界限
- 请教如何提取本地所有网卡MAC地址?
- VB.net如何将经常引用的Excel封装Excel.dll?
- telnet ip地址问题
- 如何让程序开机自动运行!
- Visual Studio 2005 和 .NET Framework 2.0 RTM 了
- 如何复制Excel的内容到Datagrid(Winform)里面去?
- 请教一个字符串截取问题
- c#的困惑,我对c#开发一般的c/s结构的应用心里一点数都没有
- vb程序员学C#的问题
- Decimal类型转换为String后怎么去掉后面多余的0
- 在线等,在VS。NET里,WINDOWS应用程序开发,DATAGRID数据源之后,怎么绑定段,
实际上Collect() 仅对大多数程序员罕见的少数的特殊情况有用,而大多数情况是没有用的
不要依赖于Collect() 方法
2、任务管理器显示的物理内存占用量,也不完全都是程序自己占用的,有些内核对象占用的空间也被计算在内
3、GC.Collect 方法并不保证回收所有无法访问的内存可以这么写(这个技巧来自《.NET 框架程序设计》):
// 先强制回收一次内存(内存仍未释放,因为对象还要"复苏",然后执行Finalize方法)
GC.Collect();
// 等待所有对象的Finalize方法调用完成
GC.WaitForPendingFinalizers();
// 再次回收(此时内存空间才会被真正释放)
GC.Collect();窗口最小化时内存占用量下降,是因为Windows自动把程序此进程不常用的内存交换到页面文件,把内存空间让给活动窗口
这个特性对于所有Windows程序默认都一样(除非通过SetProcessWorkingSetSize API直接指定working set大小),当然也包括.NET程序
窗口最小化后窗体没有重会事件产生所以占用的内存变小了
我记得以前在别的地方看到过类似的帖子
这样的理解不对吗 为什么
对象 = null或者离开作用范围均可
反过来说如果不是的话Collect()也没用,那个是前提@mm521
绘制窗口的过程速度极快且不会占用多少内存,这个不会是重点
另外如果你说的GDI资源是Device Context的话,这是系统内核对象,它占用的内促是不会因为最小化窗口而释放的
在前面已经说过,内存占用变小是假象,任务管理器只报告了物理内存占用,程序占用的内存只是从一个地方移到另一个地方而已
但是这个速度源于GC在GC Heap上不断移动对象位置使之挨个相连,性能在这里消耗了
最常见的作用域:for ( int i = 0 ; i < a.length; i++ )//i的作用域仅限于for花括号内。using ( IDbConnection Connection = GetConnection() )
{
DataSet ds = new DataSet();//仅限于using块内
.....
}
GC.Collect();//可以释放上面的DataSet当然,我们也可以人为的创造一些作用域,避免变量名称冲突和减轻内存开销。{
int i;
......
}{
int i;
.....
}如果为了编排好看可以这样:
if ( true )//执行某任务
{
int i;
......
}
{
int i;
......
}
这种语句块没用的,值类型都在堆栈之上
DataSet的那个理论上要好那么一点点,加入它真的很大的话
答:IDisposable接口:定义一种释放分配的非托管资源的方法。
作为数据访问层,很重要的一个方面是数据库连接等资源释放的问题。虽然.NET技术提供了有关当托管对象不再使用时,垃圾回收器会自动释放分配给该对象的内存的机制。但是,进行垃圾回收的时间不可预知。另外,垃圾回收器对打开的文件,数据库连接等非托管资源一无所知。由此就可能产生问题,有一些数据库连接资源,连接对象等未得到及时的释放,这样将引起资源浪费,系统性能下降等问题。将IDisposable接口的Dispose方法与垃圾回收器一起使用来显示释放非托管资源。当不再需要对象时,对象的使用者可以调用此方法。这种方法可以有效地释放资源,提高系统性能。
// 先强制回收一次内存(内存仍未释放,因为对象还要"复苏",然后执行Finalize方法)
GC.Collect();
// 等待所有对象的Finalize方法调用完成
GC.WaitForPendingFinalizers();
// 再次回收(此时内存空间才会被真正释放)
GC.Collect();
这个方法没有试过。不知道是不是奏效。等有时间测试一下。那位有时间就写个测试,把结果贴出来大家参考。
不明白