如何避免字符串导致碎片化为 LOH

how to avoid strings causing fragmentation into LOH

我的应用程序从文本文件中读取大量数据,这些数据进入大型对象堆,最终导致碎片问题。是否有任何替代设计方法可以帮助避免将这些带到 LOH?我知道 StringBuilder 但似乎从文本文件中读取仍然在内部将大字符串创建到 LOH 中。

如果您不想更改对 ReadAllLines 的调用,则无法避免在字符串足够大时分配给 LOH(除了克隆 .Net github 存储库,更改分配策略,并重新编译)。任何其他解决方案都会看到要么从文件中读取较小的字符串,要么将文件作为字节读取到您自己的缓冲区中,然后您自己管理字节的分配和排列,可能通过创建您自己的字符串 class (因为 System.String 总是复制到它自己的缓冲区中)。

但是,您现在可以选择 .Net >=4.5.1:LOH 压缩。要手动执行此操作,请执行以下命令:

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();