У меня есть приложение .NET 3.5
- Функция выполняется миллион раз
- Он выполняет операции поиска, замены и регулярного выражения в строках размером 1 МБ + (строки разного размера)
Когда я профилирую приложение, я могу подтвердить, что эти строки хранятся в 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? Я должен обработать эти строки, и они большие строки. Должен ли я найти способ разделить их и обработать так? В этом случае запуск регулярных выражений и т. Д. В разделенных строках будет очень сложным.