如何解决.net垃圾收集标记阶段和庞大的链接列表
| 如果存在一个具有4M +节点的链表,那么标记阶段是否每次都需要遍历整个列表以构建图形?在这种情况下是否应用了任何优化?从表面上看,它看起来并不高效。有没有一种方法可以验证GC是否遍历整个列表? TIA。解决方法
是的,它将需要遍历整个对象图。老实说,我无法考虑如何进行任何优化……但是它不需要在每个节点上做很多事情。我怀疑,大部分时间可能会花在等待内存上,因为很显然,它会在缓存中燃烧。当然,到链表最终出现在gen2中时(如果您要分配数百万个节点,其中大部分将很快出现在gen2中),则只需很少这样做。
如果这是您应用程序的最合理的数据结构,那么我暂时将使用它,但是请使用Performance Monitor等跟踪垃圾回收对性能的影响。如果发现这是个问题,则可以考虑使用其他策略。
, 乔恩说了什么。
同样,一旦对象最终进入Gen2,则可以进行优化(在Windows上,但在其他平台IIRC上除外),即GC可以向内核注册以通知给定内存页面。如果GC事件之间的页面保持不变,则无需重复某些工作。
, 正在进行一项非常重要的优化。 .NET GC是世代相传的,第二代中的数据很少被遍历。
使用大型数据结构(例如巨大的链表),您的大多数数据将很快以Gen2结尾,而GC仅会很少访问它。
同样,GC仅在收集期间遍历实时数据,“免费”收集无效数据。因此,当您的列表变得无法访问时(或者如果它的大多数节点(但不是全部)都可以访问),则GC基本上可以免费收集数百万个节点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。