如何在c#早期清除内存

时间:2011-02-09 09:31:53

标签: c# .net garbage-collection

使用完变量后,我可以在GC之前提前清除内存吗?

7 个答案:

答案 0 :(得分:9)

如果需要立即释放特定资源,请实施IDisposable接口并在某些对象(例如流)上调用Dispose()(有时Close()。)

如果您希望防止密码在其生命周期内保留在内存中,SecureString支持此功能,但使用起来并不简单。

否则,您无法控制垃圾收集器何时运行或实际执行的操作。如果你迫切需要这种控制,你需要一种较低级别的语言。

答案 1 :(得分:4)

正如@Hinek所说,你应该致电GC.Collect()。但是,如果您希望立即清除内存,它本身就不会起作用。你应该致电:

   //Force garbage collection.
   GC.Collect();

   // Wait for all finalizers to complete before continuing.
   GC.WaitForPendingFinalizers();

答案 2 :(得分:2)

将其值设置为null。如果没有找到对该对象的其他引用,则GC将收集它(在下一次GC运行期间)。但是你无法通过自己清除内存(非托管资源除外)。

答案 3 :(得分:1)

您可以强制系统进行扫描并评估所有对象,并通过调用GC.Collect();来考虑收集它们

如果仍然引用了对象,则不会收集它们。

答案 4 :(得分:1)

您可以将变量设置为null并运行GC.Collect()

http://msdn.microsoft.com/de-de/library/system.gc.collect(v=vs.80).aspx

答案 5 :(得分:1)

您可以使用此方法:

public static void FlushMemory()
    {
        Process prs = Process.GetCurrentProcess();
        try
        {
            prs.MinWorkingSet = (IntPtr)(300000);
        }
        catch (Exception exception)
        {
            throw new Exception();
        }
    }

使用此方法的三种方法。

1 - 在处理了类,....等管理对象后。

2 - 创建具有这2000个间隔的计时器。

3 - 创建线程来调用此方法。

我建议您在线程或计时器中使用此方法。

答案 6 :(得分:0)

正如@Mayank所说的那样使用

GC.Collect();
GC.WaitForPendingFinalizers();

由于程序不会继续并增加内存使用量,直到释放以前使用过的内存。