C. *_*mar 9 .net c# garbage-collection
我正在开发一个创建交互式图表的程序.但是,即使禁用了程序的渲染层,也会出现以下问题.
在我的应用程序的某些屏幕上,根据Visual Studio 2015诊断工具,GC每秒大约运行4次,从而导致应用程序的性能下降(从120fps降至15fps).
我拿了一些期望看到意外分配的内存快照,但根据快照,每隔几秒就只有一两个System.Internal.HandleCollector + HandleType的分配和集合,这似乎是正常的,即使问题没有发生.
我注意到的其他一些事情:
在这一点上,我很难过.有没有人看到这种情况发生或知道我应该在哪里开始调试?
小智 5
来自https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx
当满足以下条件之一时,就会发生垃圾收集:
系统物理内存不足。
托管堆上分配的对象使用的内存超过了可接受的阈值。该阈值随着进程的运行而不断调整。
调用 GC.Collect 方法。在几乎所有情况下,您不必调用此方法,因为垃圾收集器连续运行。此方法主要用于特殊情况和测试。
也许您满足上面列出的三个条件之一。您的应用程序似乎使用了大量内存,因此垃圾收集正在运行以尝试清理一些对象以释放一些内存。
也可能是GC.Collect()您的代码中的某个地方导致垃圾收集器再次运行。
以下是一些与垃圾收集相关的故障排除指南。特别是有一节似乎与您遇到的问题相关。在标记为“问题:垃圾收集期间 CPU 使用率过高”的部分下显示:
垃圾回收期间 CPU 使用率会很高。如果大量的处理时间花费在垃圾收集上,则表明收集次数太频繁或收集持续时间太长。托管堆上对象的分配率增加会导致垃圾收集更频繁地发生。降低分配率会降低垃圾收集的频率。
您可以使用分配字节/秒性能计数器来监控分配率。有关详细信息,请参阅 .NET Framework 中的性能计数器。
集合的持续时间主要是分配后存活的对象数量的一个因素。如果仍有许多对象需要收集,垃圾收集器必须使用大量内存。压实幸存者的工作非常耗时。要确定收集期间处理了多少对象,请在指定代的垃圾收集结束时在调试器中设置断点。
您应该检查调用 GC 的位置的代码。通常它每秒运行远少于 4 次。将调试器或分析器附加到存在问题的实例,以查找调用 GC 的位置。也许它在第三方库中。或者一些你没有想到要检查的代码。