Tag: 垃圾收集

处理列表的最佳方式

我有List对象。 我该如何处理清单? 例如, List usersCollection =new List(); User user1 = new User(); User user2 = new User() userCollection.Add(user1); userCollection.Add(user2); 如果我设置userCollection = null; 会发生什么? foreach(User user in userCollection) { user = null; } 哪一个最好?

托管托管代码和垃圾回收

我有一个C ++进程外COM服务器,它承载了很多C#代码,以支持C ++ COM对象公开的API。 由于各种原因,我正在考虑取消我的解决方案的C ++部分。 但是,由于我无法控制的限制,我必须保留进程外的COM服务器。 微软确实在这里有一个典型的例子。 看看这个例子,我有些不明白。 在消息循环开始之前,会创建一个计时器,每隔5秒调用GC.Collect。 我能找到的唯一提到的就是确保在合理的时间范围内释放COM对象。 我对此有点困惑…我的C ++主机当前是否自动调用GC.Collect? 我当然不是这样做的。 然而,我正在创建托管对象(COMVisible(true)作为C ++代码中的COM对象。这是否意味着我现在应该每5秒调用一次GC.Collect?如果没有,为什么我需要在这个新的C#中调用它是否可以弥补在普通C ++应用程序中清理未引用的COM对象的自动进程?(我假设在消息循环期间的某个时间发生了这种情况)。 每5秒调用一次GC.Collect似乎可能是一个坏主意。 我担心吗? 是否有其他方法可以达到相同的效果? 我使用的是.NET 4.5和Visual Studio 2012。

获取对象的活动引用

我正在寻找一个托管/非托管API,它将允许我找到哪些对象引用另一个对象,并可能防止它被垃圾收集。 这样的API可能如下所示: var foo = new Foo(); var bar = new Bar(); bar.Foo = foo; var references = GC.GetReferencesTo(foo); // references is an array that contains bar 我知道可以使用分析器,但我想将它作为unit testing的一部分。 我可以使用托管或非托管API吗?

将GC.AddMemoryPressure与非托管资源一起使用有什么意义?

我已经通过c#在MSDN和CLR上阅读了这个问题。 想象一下,我们分配了一个2Mb的非托管HBITMAP和一个指向它的8字节托管位图。 使用AddMemoryPressure告诉GC有什么意义,如果它永远无法对该对象做任何事情,因为它被分配为非托管资源,因此不易受垃圾收集的影响?

如何避免实时.NET应用程序中的垃圾收集?

我正在编写一个金融C#应用程序,它从网络接收消息,根据消息类型将它们转换为不同的对象,最后将应用程序业务逻辑应用于它们。 关键是在应用业务逻辑之后,我非常确定我将永远不再需要这个实例。 我不想等待垃圾收集器释放它们,而是明确地“删除”它们。 有没有更好的方法在C#中这样做,我应该使用一个对象池来重用总是同一组实例,还是有更好的策略。 目标是避免垃圾收集在时间关键过程中使用任何CPU。

代表可以导致内存泄漏吗? GC.TotalMemory(true)似乎表明了这一点

码 using System; internal static class Test { private static void Main() { try { Console.WriteLine(“{0,10}: Start point”, GC.GetTotalMemory(true)); Action simpleDelegate = SimpleDelegate; Console.WriteLine(“{0,10}: Simple delegate created”, GC.GetTotalMemory(true)); Action simpleCombinedDelegate = simpleDelegate + simpleDelegate + simpleDelegate; Console.WriteLine(“{0,10}: Simple combined delegate created”, GC.GetTotalMemory(true)); byte[] bigManagedResource = new byte[100000000]; Console.WriteLine(“{0,10}: Big managed resource created”, GC.GetTotalMemory(true)); Action bigManagedResourceDelegate […]

在C#中,我应该在哪里保留计时器的参考?

System.Threading.Timer的文档说我应该为它保留一个实时引用,以避免它被垃圾收集。 但是我应该在哪里这样做? 我的main是很简单,我不知道在哪里保留参考: class Program { static void Main() { new System.Threading.Thread(myThreadStart).Start(); new System.Threading.Timer(myTimerCallback, new MyStateObject(), 0, 5000); } } 我考虑将引用保存在Program类的static字段中,假设在应用程序结束之前不会收集static字段。 但我不确定这是最好的方法,所以我很感激你的建议。

这些人如何避免制造任何垃圾?

这是我在网上发现的一篇有趣的文章 。 它讨论了该公司如何在托管环境中解析大量财务数据,主要是通过对象重用和避免字符串等不可变因素。 然后他们继续说明他们的程序在连续操作阶段没有做任何GC 。 这是非常令人印象深刻的,我想知道这里是否有其他人有关于如何做到这一点的更详细的指导 。 首先,我想知道如何避免使用字符串,当消息中的某些数据是字符串时,无论客户端应用程序正在查看消息,都希望传递这些字符串? 另外,你在启动阶段分配了什么? 你怎么知道它够了? 声明一大块内存并保留对它的引用以便GC不会启动它是否很简单? 客户端应用程序使用这些消息怎么样? 是否还需要按照这些严格的标准编写? 另外,我需要一个特殊工具来查看内存吗? 到目前为止,我一直在使用SciTech内存分析器。

.NET Garbagecollector麻烦。 阻挡15-40分钟

一些事实:我们开发了wcf服务,充当客户端和数据库之间的层。 它是自主设备并作为Windows服务运行。 该服务保留了几个缓存,其中最大的内存大约为1-2gb。 总内存使用量通常约为5-8gb。 连接是双工的,使用tcp协议,序列化使用protobuf-net。 我们的连接客户端数量通常在1000-1500之间。 该服务器是一个8核xeon的新型号,内存为64GB,并且只运行该服务。 问题:经过一段时间后,从一天到一周,服务变得非常缓慢。 需要0.5秒的请求可能需要一分钟。 此行为持续15-40分钟或直到服务重新启动。 我们做了什么:我们检查了服务器的网络和网络连接,没有问题。 从f.eks开始,这段时间CPU利用率有所上升。 平均30%至40-50%。 我们已经进行了内存转储,代码中没有阻止用户的逻辑锁,也没有多少活动。 我们最新的领导是垃圾收集器。 在perfmon中,我们可以看到“gc中的%time”不断超过90%,(90-97%)并且收集计数增加。 GC0和GC1都有。 我们怀疑还有阻止GC2运行,但我们不得不重新启动服务,因为它正在生产中,因此在我们运行perfmon的5分钟窗口期间它没有计数。 内存使用量为7,6 Gb。 注意:呼叫突然上升,因此呼叫到达那里,但服务不处理它们。 我的问题是,垃圾收集器能否处于运行状态并持续阻塞超过15分钟? 或者问题可能与其他问题有关? 我们的服务在工作站模式和延迟模式下运行GC:交互式我们现在已将其更改为Server和SustainedLowLatency,并希望这会有所帮助。 如果它是垃圾收集器,还有什么我们可以做的吗? 编辑:大容量内存使用是设计的,缓存中的数据很大,并且有更多的可用内存。

GC.Collect循环?

我使用Reflector在System.Web.ISAPIRuntime中找到了这段代码 public void DoGCCollect() { for (int i = 10; i > 0; i–) { GC.Collect(); } } 任何人都可以评论这个吗? 是否有理由在循环中执行GC.Collect()? 为什么10次而不是3次,5次或20次? 分析表明它没有在.net框架内使用,但它是公共的,所以我想IIS可以调用它… 编辑: 仅仅是为了澄清目的:我从未打电话给GC.Collect,我无意使用它。 我知道在大多数(如果不是全部)案例中这是一个坏主意。 问题是.net框架为什么这样做。 谢谢你的所有答案。