使用完变量后,我可以在GC之前提前清除内存吗?
答案 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();
由于程序不会继续并增加内存使用量,直到释放以前使用过的内存。