【发布时间】:2010-03-24 23:25:16
【问题描述】:
在我的工作中,我们正在讨论清理大量托管 ~ 50-100MB 内存的不同方法。有两种方法可供讨论(阅读:两位高级开发人员不能同意)并且没有经验团队的其他成员不确定哪种方法更可取,性能或可维护性。
正在收集的数据是许多小项目,大约 30000 个,其中又包含其他项目,所有对象都得到管理。这些对象之间有很多引用,包括事件处理程序,但不包括外部对象。我们将这一大组对象和引用称为单个实体,称为 blob。
方法#1:确保对 blob 中对象的所有引用都被切断,让 GC 处理 blob 和所有连接。
方法 #2: 在这些对象上实现 IDisposable,然后对这些对象调用 dispose 并设置对 Nothing 的引用并删除处理程序。
第二种方法背后的理论是因为大的寿命更长的对象需要更长的时间在 GC 中清理。因此,通过将大对象切成小块,垃圾收集器将更快地处理它们,从而提高性能。
所以我认为基本问题是:拆分大量相互关联的对象是否会优化垃圾收集的数据,还是将它们保持在一起并依靠垃圾收集算法为您处理数据更好?
我觉得这是一个预优化的情况,但我对 GC 的了解还不够,无法知道什么有助于或阻碍它。
编辑:强调内存的“blob”不是单个大对象,它是多个单独分配的小对象。
如果有帮助,请提供更多背景信息。我们有“泄漏”,因为对象没有被 GCed。两种方法都解决了泄漏问题,但目前尚在争论哪种方法更合适。
【问题讨论】:
-
你的“大物体”有多大?大到足以让大对象堆成为这里的一个因素吗?还是您的意思是“大”,因为只是许多小物体的集合?如今,100MB 的内存似乎并不“大”,到目前为止,开发团队花在讨论这个问题上的时间,你可以获得多少内存条?
-
'large' 作为小对象的聚合,约 50MB 用于 30000 个对象。是的 100 或 50MB 不是很多,但它只是程序的一部分,应用程序的其余部分大约需要 750MB。
-
为什么大对象比小对象更昂贵? GC主要受访问对象数量的影响。它们的大小基本上是无关紧要的
-
@jalf:实际上,没有。较大的对象不像小对象那样经常被收集。请参阅下面的@vittore 链接。
-
@zneak:这和我说的有什么矛盾?我说过收集对象的成本不受大小的影响(这在技术上是不准确的,因为大对象往往有更多的传出引用需要 GC 扫描,但如果将对象拆分为更小的子对象,也会产生相同的成本) .但我从来没有说过收集大对象的经常。
标签: .net performance garbage-collection