我有一个.NET 3.5应用程序。
- 一个函数运行了一百万次
- 它在1MB+字符串(不同大小的字符串)中执行搜索、替换和正则表达式操作
当我对应用程序进行分析时,我可以确认这些字符串存储在LOH中,但稍后被GC回收,因此在给定时间内只有最多10个字符串在LOH中(10个线程正在运行)。
我的理解是,这些大字符串位于LOH中,然后由于它们的分配位置(以及位于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碎片化问题?我必须处理那些字符串,并且它们都是很大的字符串。我应该找到一种方式将它们分开进行处理吗?在这种情况下,在拆分后的字符串中运行正则表达式等操作会非常具有挑战性。