Странный шаблон использования памяти в приложении C # Windows Form

Я пытаюсь понять, что происходит в приложении, написанном на C #. Ниже приведены несколько изображений, взятых из монитора производительности. Синяя линия - # байт во всех кучах. Зеленая линия - размер кучи больших объектов. Я запускаю приложение и вхожу в систему. Приложение не используется. Первое изображение показывает, что LOH по какой-то причине увеличивается, а затем падает. Шаблон очень четкий. Что отвечает за такое поведение?

введите описание изображения здесь

Более. Я выполняю тяжелую обработку, начиная с A (см. Изображение ниже), используя базу данных Oracle через ODP.NET. После этого приложение снова остается бездействующим. LOH не падает. Вместо этого он по какой-то причине продолжает расти. Обратите внимание, что приложение неактивно. Он просто открыт на моем рабочем столе. Я даже не взаимодействую с ним.

введите описание изображения здесь

Память продолжает увеличиваться (каждое изображение представляет 1:15:00).

введите описание изображения здесь

По прошествии более 2 часов он внезапно уменьшается, а через некоторое время снова начинает увеличиваться / уменьшаться (см. Ниже), как на первом изображении. Все время приложение простаивает. Что здесь происходит? Это утечка памяти? Я так не думаю. Мы профилировали приложение и ничего не нашли. Также LOH увеличивается без какой-либо активности. Нет открытого соединения с базой данных Oracle. Может ли быть виноват ODP.NET?

введите описание изображения здесь


person Eduardo Mauro    schedule 22.07.2011    source источник
comment
Не верьте, что кто-то может вам в этом помочь. Слишком уж конкретный проект.   -  person Tigran    schedule 22.07.2011
comment
Мы используем профилировщик и ничего необычного не обнаружили. Дело в том, что что-то происходит под GC. Почему увеличивается выделение памяти, если приложение простаивает, и почему оно внезапно уменьшается. Если я просто войду в систему, приложение покажет бессмысленную схему распределения / освобождения. Что это делает?   -  person Eduardo Mauro    schedule 22.07.2011
comment
Начните с известной базовой линии. Создайте тривиальный проект Winforms, который ничего не делает, кроме создания формы. Запустите его и измерьте использование памяти. У вас такое же странное поведение? Тогда проблема не в вашем коде; происходит что-то странное. Затем вы можете исследовать, что это такое, не беспокоясь о том, что это что-то в вашем коде. Получаете ли вы ожидаемое поведение от тривиальной программы? Тогда что-то изменится в простой обработке вашего кода и в тривиальном проекте winforms. Что это могло быть, возможно, знать только вы.   -  person Eric Lippert    schedule 22.07.2011
comment
Поведение первого изображения вверх и вниз начинается сразу после того, как я вхожу в систему. Таким образом, оно начинается сразу после установления соединения с базой данных Oracle, выполнения хранимой процедуры и закрытия соединения. Больше ничего не делается, и приложение остается бездействующим. Как я уже сказал, мы подозреваем, что виноват ODP.Net.   -  person Eduardo Mauro    schedule 23.07.2011


Ответы (1)


Проблема определенно связана с ODP.NET. Если я отключу пул соединений, проблема не проявится. Кажется, что для каждого подключения ODP.NET создает 2 потока и с интервалом в 3 минуты (как видно на изображениях) ODP.NET выполняет некоторые служебные операции, но по какой-то причине выделяет память, которая не освобождается сразу.

Легко воспроизвести. Просто создайте простое приложение, в котором при нажатии кнопки открывается соединение с базой данных Oracle и выполняется хранимая процедура. Вы заметите узор на первом изображении. Шаблон других изображений обусловлен количеством подключений, созданных приложением.

person Eduardo Mauro    schedule 01.08.2011