内存释放问题 在wince5.0下用new申请的内存是如何来释放的?系统会自动来释放的么?似乎不会,在监控下显示的内存在一点点减少。用gc来清理也不可行,请教下各位做过wince编程的大侠们,怎么来释放的?C#语言编写的程序。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 只要是C#语言写的,在托管下运行,不需要关心释放啊。释放内存是由.NET虚拟机来完全,和系统没有关系。 wince不太清楚,我给你一段window清理内存的方法,希望你能用的上:[DllImport("kernel32.dll")] private static extern bool SetProcessWorkingSetSize( IntPtr process, int minSize, int maxSize); /// <summary> /// 清理内存 /// </summary> public static void FlushMemory() { GC.Collect(); GC.WaitForPendingFinalizers(); if (Environment.OSVersion.Platform == PlatformID.Win32NT) SetProcessWorkingSetSize(System.Diagnostics. Process.GetCurrentProcess().Handle, -1, -1); } 不再使用对象=null;可以使垃圾回收更有效率 to:jxxx2967理论上是这样,但是实际上它确实是没有释放,我用的平台是wince5.0to:mafgm谢谢,可能用不上,试过,但是没有多大改进to:jhkemail如果是这样,我申请的所有临时变量岂不是要用过的都要=null一下?太麻烦了吧…… Finalize 方法 1.仅在要求终结的对象上实现 Finalize。存在与 Finalize 方法相关的性能开销。 如果需要 Finalize 方法,应考虑实现 IDisposable,以使类的用户可以避免调用 Finalize 方法带来的开销。(juky_huang注:在实现IDisposable的类中,可以通过GC.SuppressFinalize来停止Finalize的运行,这样只要显式的调用了Dispose方法,就能给用户提供更小的开销。如果用户没有显式的调用Dispose方法,也就是没有停止Finalize的运行,这样就可以隐式的实现非托管资源的释放) 2.不要使 Finalize 方法更可见。它应该是 protected,而不是 public。 (juky_huang注:这个很重要,Finalize方法一般是系统调用,用户不去显式的调用它) [Page]3.对象的 Finalize 方法应该释放对象拥有的任何外部资源。此外,Finalize 方法应该仅释放由对象控制的资源。Finalize 方法不应该引用任何其他对象。 4.不要对不是对象的基类的对象直接调用 Finalize 方法。在 C# 编程语言中,这不是有效的操作。 5.从对象的 Finalize 方法调用 base.Finalize 方法。(juky_huang注:就是派生类调用基类的Finalize方法) base.Finalize 这个方法都没点出来,估计不支持 楼主是不是定义了大变量。大变量一般代数比较高,回收也是需要时间的。比如你有一个64K的大变量,这样的变量new好之后直接在1代的。而回收机制是0代回收很多次才会轮到1代回收。这时加入你的变量还忘记调用Disposed方法,那么会提升到2代,这样不知道要等到何时才能被回收呢。我觉得楼主可能是在因为.Net垃圾回收机制的问题才出现这种问题的。另外,只要代码是C#写的,没有用COM,应该不会出现泄漏,顶多回收时间长一点而已 没用的对象 = null 是一种好的习惯. finalize是不能手动调用的,可以试下dispose方法可能是非托管资源没有释放吧,因为只有执行了finalize方法才能回收非托管资源而finalize执行有条件的,要CLR关闭,垃圾回收,1代满了等等所以你手动调用GC回收下 GC也不行?先用dispose在GC或者GC,2次因为非托管资源可能出现复苏的现象,因为有2个结构保存非托管资源的句柄,你去看下框架设计第2版本的垃圾回收,对于非托管资源的垃圾回收,讲的很清楚。 GC2次??楼上几位说的似乎可行,我在测试中把使用过的局部变量(比较大的二维数组赋值null)似乎有好转,但是程序跑死存在随即性非常强,有可能是一个操作执行几十次就跑死,也有可能是执行上千次都没问题,按理说应该是内存泄漏吧?但是改了之后效果并不明显 很笼统的一个解释,而且释放并不干净,似乎还没有赋值null有效, 楼主是否存在递归,在.net中递归的话很容易就产生了貌似内存泄露的问题,因为长时间递归导致很长时间不释放局部变量,看起来就像内存泄露了 一般情况下我是不用递归的,尽量用for循环来取代递归,哪怕写起来会麻烦点,即便是for循环一般也是比较小的循环,不存在楼上说的这个情况 C# double类型小数位统计~~ 求一个正则表达式 高分请帮手,懂C的帮帮忙! C#音频包解决方案 vs2003无法加载设计器 关于WinForm里一个Form的重用问题 这种iframe刷新问题该怎么来实现呢? 扫盲题!!!!!!!! 如何将C#查询到的多维数据集输出到本地文件 [求救] C#连接Oracle9i数据库出现的问题 C# sendmessage问题 求一个类似QQ的侧边选项卡控件
[DllImport("kernel32.dll")]
private static extern bool SetProcessWorkingSetSize( IntPtr process, int minSize, int maxSize);
/// <summary>
/// 清理内存
/// </summary>
public static void FlushMemory()
{
GC.Collect(); GC.WaitForPendingFinalizers(); if (Environment.OSVersion.Platform == PlatformID.Win32NT) SetProcessWorkingSetSize(System.Diagnostics. Process.GetCurrentProcess().Handle, -1, -1);
}
可以使垃圾回收更有效率
理论上是这样,但是实际上它确实是没有释放,我用的平台是wince5.0
to:mafgm
谢谢,可能用不上,试过,但是没有多大改进
to:jhkemail
如果是这样,我申请的所有临时变量岂不是要用过的都要=null一下?太麻烦了吧……
1.仅在要求终结的对象上实现 Finalize。存在与 Finalize 方法相关的性能开销。
如果需要 Finalize 方法,应考虑实现 IDisposable,以使类的用户可以避免调用 Finalize 方法带来的开销。(juky_huang注:在实现IDisposable的类中,可以通过GC.SuppressFinalize来停止Finalize的运行,这样只要显式的调用了Dispose方法,就能给用户提供更小的开销。如果用户没有显式的调用Dispose方法,也就是没有停止Finalize的运行,这样就可以隐式的实现非托管资源的释放)
2.不要使 Finalize 方法更可见。它应该是 protected,而不是 public。 (juky_huang注:这个很重要,Finalize方法一般是系统调用,用户不去显式的调用它)
[Page]3.对象的 Finalize 方法应该释放对象拥有的任何外部资源。此外,Finalize 方法应该仅释放由对象控制的资源。Finalize 方法不应该引用任何其他对象。
4.不要对不是对象的基类的对象直接调用 Finalize 方法。在 C# 编程语言中,这不是有效的操作。
5.从对象的 Finalize 方法调用 base.Finalize 方法。(juky_huang注:就是派生类调用基类的Finalize方法)
比如你有一个64K的大变量,这样的变量new好之后直接在1代的。
而回收机制是0代回收很多次才会轮到1代回收。这时加入你的变量还忘记调用Disposed方法,那么会提升到2代,这样不知道要等到何时才能被回收呢。
我觉得楼主可能是在因为.Net垃圾回收机制的问题才出现这种问题的。
另外,只要代码是C#写的,没有用COM,应该不会出现泄漏,顶多回收时间长一点而已
finalize是不能手动调用的,可以试下dispose方法
可能是非托管资源没有释放吧,因为只有执行了finalize方法才能回收非托管资源
而finalize执行有条件的,要CLR关闭,垃圾回收,1代满了等等所以你手动调用GC回收下
先用dispose在GC
或者GC,2次因为非托管资源可能出现复苏的现象,因为有2个结构保存非托管资源的句柄,你去看下框架设计第2版本的垃圾回收,对于非托管资源的垃圾回收,讲的很清楚。
很笼统的一个解释,而且释放并不干净,似乎还没有赋值null有效,
一般情况下我是不用递归的,尽量用for循环来取代递归,哪怕写起来会麻烦点,即便是for循环一般也是比较小的循环,不存在楼上说的这个情况