【发布时间】:2008-09-17 16:54:11
【问题描述】:
我正在编写一个金融 C# 应用程序,它接收来自网络的消息,根据消息类型将它们转换为不同的对象,最后在它们上应用应用程序业务逻辑。
关键是在应用了业务逻辑之后,我很确定我再也不需要这个实例了。我不想等待垃圾收集器释放它们,而是明确地“删除”它们。
在 C# 中是否有更好的方法来做到这一点,我应该使用对象池来始终重用同一组实例还是有更好的策略。
目标是避免垃圾收集在时间关键的过程中使用任何 CPU。
【问题讨论】:
-
在 .Net 中,当 (a) 创建给定对象的速度很慢,或 (b) 在 32 位应用程序中,为了减少数组/列表/字典的内存碎片,池化很有用等使用大于 64 KB 的数据块,例如> 8K 元素 x 8 B/元素,或 16K 元素 x 4 B/元素。 .Net 从不重新定位(移动)如此大的块,如果您每次请求不同的大小,这可能会导致内存碎片。更安全地分配足够大的 # 元素并保留它们。 (但在不使用时清除它们的字段,以便 GC 可以回收它们指向的任何内容。)如果超出分配的大小,则将 # 个元素加倍。
-
在极端情况下,我有一个 32 位应用程序(由于依赖项在 64 位中不起作用),所以即使我使用的是具有大量 RAM 的 64 位 Windows ,为了避免内存碎片,我必须保留列表列表,以便每个子列表适合 64 KB,这样 .Net 就不会在“大对象堆”上分配。因此它可以在 GC 期间“压缩”内存,而不是在应用程序的 4 GB 地址空间中创建大的“洞”。这个特定的应用程序是有问题的,因为它包含大量来自本机(非 .Net)内存的 DirectX 分配。非 .Net 和 .Net 分配的混合导致了碎片化。
标签: c# .net garbage-collection real-time finance