我有一个 .NET 3.5 应用程序
- 一个函数运行一百万次
- 它在 1MB+ 字符串(不同大小的字符串)中进行搜索、替换和正则表达式操作
当我分析应用程序时,我可以确认这些字符串存储在 LOH 中,但它们稍后也会被 GC 回收,因此在给定时间,其中最多只有 10 个在 LOH 中(10 个线程正在运行)。
我的理解是,这些大字符串位于 LOH 中,然后被 GC 回收,但不知何故由于它们的分配位置(并且在 LOH 中因此没有被压缩),这会导致碎片。尽管操作中没有内存泄漏,但仍会发生这种情况。
它不会在大约 100K 次内引起问题,但是当它达到 1M+ 时,它会出现内存不足的异常。
我正在使用 ANTS Memory Profiler,这是我在早期执行中得到的结果:
.NET Using 70MB of 210MB total private bytes allocated in to the application
Number of Fragments: 59
Number of Large Fragments : 48 (99.6% of free memory)
Largest Fragment: 9MB
Free Space: 52% of total memory (37MB)
Unmanaged Memory: 66% of total private memory (160MB)
- 根据手头的数据,你认为我的诊断是正确的吗?
- 如果是这样,我该如何解决这个 LOH 碎片问题?我必须处理这些字符串,它们是大字符串。我应该找到一种方法将它们分开并像这样处理吗?在这种情况下,在拆分字符串中运行正则表达式等将非常具有挑战性。