Это - хитрое. Существует действительно 2 основных способа, которыми Вы получите эту ошибку.
1) у Вас есть свой набор проекта, чтобы вынудить задержку загруженный DLLs загрузиться в запуске приложения. DWMAPI.dll является загруженным задержкой DLL и таким образом обычно не будет загружаться, если один из него не функции, назван. Этого не произойдет на XP, если Вы не попытаетесь сделать это в своем DLL. Но возможно установить параметр компилятора, чтобы вынудить Ваше приложение загрузить задержку загруженный DLLs так или иначе. При выполнении этого не делать.
2) Это часто - ложная ошибка, которую Вы получите из depends.exe, когда будет другая проблема. Выполните свой DLL через зависимость Уокер и посмотрите, существуют ли какие-либо другие проблемы зависимости. Если все остальное перестало работать, попытайтесь удалить IE7 и посмотрите, сохраняется ли проблема. Если это будет ложная ошибка после установки IE7, то Вы будете видеть реальную ошибку. Можно установить IE7 снова впоследствии.
Команда !findroots
в .NET 4's SOS (или !refs
в SOSEX) ждет до следующего GC (вы можете указать, какое поколение) и затем сообщает, какие корни имеет объект.
По моему опыту, редко бывает полезно смотреть на Object []
, поскольку это базовый тип многих типов, а это означает, что в конечном итоге вы получите Многие из них находятся в куче, что затрудняет определение правильного. Кроме того, внутренние структуры, такие как таблица интернированных строк , также хранятся как Object []
.
Если вы пытаетесь выяснить, почему приложение использует много памяти, попробуйте чтобы определить другие типы, которые могут или не могут инкапсулировать Object []
, и выяснить, что их корни.
Если вы предоставите дополнительную информацию о том, чего вы пытаетесь достичь, я, возможно, смогу дать более конкретный совет.
РЕДАКТИРОВАТЬ: Фрагментация не обязательно так плоха, как может показаться, и 100 МБ бесплатно не кажутся мне тревожно большим числом.
GCRoot обычно не сообщает вам, почему что-то закреплено. Многие массивы объектов, которые вы найдете в CLR, используются для внутренних целей. Вместо этого, прочитав ваш комментарий к другому ответу, Могу я предложить вам сначала начать с чего-то другого, чтобы отследить утечку памяти?
Начните с "! dumpheap -stat" и посмотрите на самых крупных пользователей памяти. Однако игнорируйте основные типы среды CLR, такие как object [], string и т. Д. Найдите, какие из ваших объектов (определенных как «не что-то в mscorlib или system.dll) есть, и выясните, какие корни Т.е. обычно легче отследить утечку с этого направления, даже если окажется, что вы пропускаете примитивные типы в своем приложении.
Обычно я отслеживаю управляемые утечки в CLR. , и он достаточно хорошо работает для большинства утечек.