c # (.NET): куча второго поколения с 93% свободного места и 100% фрагментацией - PullRequest
0 голосов
/ 02 мая 2018

текущая программа, которую я написал, использует очень много памяти, например, утечка памяти. Это можно наблюдать с помощью Нагиоса. Если объем памяти очень большой, а программа работает очень медленно, я получаю дамп памяти через диспетчер задач Windows и анализирую его с помощью JetBrains dotMemory (внешний размер составляет около 1 ГБ). Здесь я вижу реальное использование ок. 73 МБ и использование памяти Heap поколения 2 660 МБ (!), 616 МБ помечены как свободные и используются 42 МБ. Фрагментация составляет 100%. Я знаю, что не могу влиять на управляемую память, и GC должен автоматически очистить память. Есть какие-то вещи, чтобы рассмотреть, чтобы решить эту проблему?

Программа представляет собой отдельное приложение на C # .NET, созданное с использованием Visual Studio 2015 и .NET 4.6 в режиме «Любой процессор». Я верю, что .NET Framework на целевой машине - это другая версия, но как я могу получить текущую установленную и используемую версию .NET runtime?

Если вам нужна какая-либо другая информация, пожалуйста, спросите меня:)

UPDATE

Программа представляет собой систему управления машиной, которая взаимодействует с SPS через OPC, содержит доступ к базе данных к базе данных Orcale и множество веб-сервисов для связи с другими граничными системами.

UPDATE

Вот изображение использования памяти из dotMemory: enter image description here

1 Ответ

0 голосов
/ 02 мая 2018

Я вижу много закрепленных объектов (красные области). Они мешают дефрагментировать кучи там, где они находятся. Запустите dotMemory с ключом командной строки / internal, в элементе управления Heap Fragmentation появится ссылка «Закрепленные объекты», где вы можете увидеть, какие объекты закреплены.

...