Tag: 垃圾收集

清除私人collections或将其设为空?

我有一个可变类,里面有一个私有的List字段。 在我的类的Reset()方法中,我应该使用其Clear()方法Clear()列表还是仅为其字段分配一个新列表? 请注意,该列表不是公共的,仅供类本身使用。 因此,分配新列表应该使旧的列表无法访问。 由于Clear()方法是一个O(n)操作 ,我想知道只是在它上面分配一个新列表的缺点是什么。

代表们的GC,我错过了什么? (我的代表没有收集)

我有一个持有代表的类,以便稍后懒惰地评估一些东西。 一旦我评估了它,通过调用委托,我清除了对委托的引用,希望它有资格收集。 毕竟,如果将它构造为匿名方法,它可能会保留一个局部变量的世界。 我尝试构建一个unit testing来validation这一点,但它似乎没有按照我计划的方式解决,相反,似乎我对WeakReference (我在这里用于测试目的)的假设,或者其他一些假设,保持水。 看看这段代码,你可以在LINQPad中运行它 void Main() { WeakReference wr; Lazy l; CreateTestData(out wr, out l); wr.IsAlive.Dump(); // should be alive here GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); wr.IsAlive.Dump(); // and alive here as well l.Value.Dump(); // but now we clear the reference GC.Collect(); // so one of these should collect it GC.WaitForPendingFinalizers(); GC.Collect(); wr.IsAlive.Dump(); // […]

C#中的固定语句

在我们的一个项目中,我们有类似的代码。 任何人都可以解释(简单英语)为什么需要修复语句? class TestClass { int iMyVariable; static void Main() { TestClass oTestClass = new TestClass(); unsafe { fixed (int* p = &oTestClasst.iMyVariable) { *p = 9; } } } }

如果程序意外关闭,IDisposable对象是否会被丢弃?

如果程序意外退出(exception或进程终止)会发生什么? 是否存在程序将终止的此类(或其他)情况,但IDisposable对象将无法正确处理? 我问的原因是因为我正在编写与外围设备通信的代码,我想确保它不会被置于糟糕的状态。

一个对象上的垃圾收集,C#

我需要处理一个对象,以便它可以释放它拥有的所有东西,但是它没有实现IDisposable,所以我不能在using块中使用它。 如何让垃圾收集器收集它?

限制C#应用程序中托管堆的大小

我可以配置我的C#应用​​程序将其内存消耗限制为200MB吗? IOW,我不想等待自动GC(这似乎允许堆增长远远超过此应用程序实际需要的)。 我知道在Java中有一个命令行开关,你可以传递给实现这个的JVM .. C#中是否有相同的东西? PS 我知道我可以从代码中调用GC,但这是我不想定期做的事情。 我宁愿在启动时以某种方式设置它并忘记它。

垃圾收集如何在对象引用上工作?

我对对象的垃圾收集过程感到困惑。 object A = new object(); object B = A; B.Dispose(); 通过仅在变量B上调用Dispose,创建的对象将不会被垃圾收集,因为对象仍被A引用。 现在,以下代码与上面的代码相同吗? public static image Test1() { Bitmap A = new Bitmap(); return A; } 现在我从其他方法调用这个静态函数。 public void TestB() { Bitmap B = Test1(); B.Dispose(); } 静态函数Test1返回对Bitmap对象的引用。 引用保存在另一个变量B中。通过调用B上的Dispose,B和object之间的连接丢失,但是从Test1传递的引用会发生什么。 它将保持活动状态,直到函数TestB的范围完成? 有没有办法处理从静态函数传递的引用?

垃圾收集器和事件处理程序

一个简单的问题。 假设我有一个如下例所示的类。 class Subscriber { private Publisher publisher = new Publisher; public Subscriber() { publisher.SomeEvent += new EventHandler(OnEventFired); } private void OnEventFired(object sender, EventArgs e) { } } 在程序的某个地方,我有一个看起来像这样的方法: public void DoSomething() { Subscriber subscriber = new Subscriber(); } 我是否正确地期望这会导致内存泄漏,因为订阅者永远不会取消订阅发布者事件,从而导致他们都保持对彼此的强引用?

C#GC for Server

.Net 4.0中是否提供Server GC(配置中的gcServer标志)? 或者它被弃用了? 谢谢!!!

为什么我的析构函数永远不会运行?

我有一个带有析构函数方法的空白Winform public partial class Form1 : Form { public Form1() { System.Diagnostics.Trace.WriteLine(“Form1.Initialize ” + this.GetHashCode().ToString()); InitializeComponent(); } ~Form1() { System.Diagnostics.Trace.WriteLine(“Form1.Dispose ” + this.GetHashCode().ToString()); } } 当表单被销毁时,我希望它写入输出窗口: (Form1开放) Form1.Initialize 41149443 (Form1已关闭) Form1.Dispose 41149443 MSDN建议实现析构函数的3种方法: ~Destructor() http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx IDisposable http://msdn.microsoft.com/en-us/library/system.idisposable.aspx SafeHandle模式http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.safehandle.aspx 但是,这些方法都不会将“Form1.Dispose 41149443”写入输出窗口。 因此,我无法判断表格是否已被销毁。 建议? 由于垃圾收集器的不确定性,我是否应该放弃实现这一目标的希望? 还有另一种方法可以知道Form1是否已被垃圾收集?