2

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

4

1 回答 1

1

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

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

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();  
于 2015-09-23T00:35:28.213 回答