Как определить, почему объект прикрепляется

Это - хитрое. Существует действительно 2 основных способа, которыми Вы получите эту ошибку.

1) у Вас есть свой набор проекта, чтобы вынудить задержку загруженный DLLs загрузиться в запуске приложения. DWMAPI.dll является загруженным задержкой DLL и таким образом обычно не будет загружаться, если один из него не функции, назван. Этого не произойдет на XP, если Вы не попытаетесь сделать это в своем DLL. Но возможно установить параметр компилятора, чтобы вынудить Ваше приложение загрузить задержку загруженный DLLs так или иначе. При выполнении этого не делать.

2) Это часто - ложная ошибка, которую Вы получите из depends.exe, когда будет другая проблема. Выполните свой DLL через зависимость Уокер и посмотрите, существуют ли какие-либо другие проблемы зависимости. Если все остальное перестало работать, попытайтесь удалить IE7 и посмотрите, сохраняется ли проблема. Если это будет ложная ошибка после установки IE7, то Вы будете видеть реальную ошибку. Можно установить IE7 снова впоследствии.

6
задан Darryl Braaten 15 October 2009 в 17:37
поделиться

3 ответа

Команда !findroots в .NET 4's SOS (или !refs в SOSEX) ждет до следующего GC (вы можете указать, какое поколение) и затем сообщает, какие корни имеет объект.

3
ответ дан 16 December 2019 в 21:43
поделиться

По моему опыту, редко бывает полезно смотреть на Object [] , поскольку это базовый тип многих типов, а это означает, что в конечном итоге вы получите Многие из них находятся в куче, что затрудняет определение правильного. Кроме того, внутренние структуры, такие как таблица интернированных строк , также хранятся как Object [] .

Если вы пытаетесь выяснить, почему приложение использует много памяти, попробуйте чтобы определить другие типы, которые могут или не могут инкапсулировать Object [] , и выяснить, что их корни.

Если вы предоставите дополнительную информацию о том, чего вы пытаетесь достичь, я, возможно, смогу дать более конкретный совет.

РЕДАКТИРОВАТЬ: Фрагментация не обязательно так плоха, как может показаться, и 100 МБ бесплатно не кажутся мне тревожно большим числом.

1
ответ дан 16 December 2019 в 21:43
поделиться

GCRoot обычно не сообщает вам, почему что-то закреплено. Многие массивы объектов, которые вы найдете в CLR, используются для внутренних целей. Вместо этого, прочитав ваш комментарий к другому ответу, Могу я предложить вам сначала начать с чего-то другого, чтобы отследить утечку памяти?

Начните с "! dumpheap -stat" и посмотрите на самых крупных пользователей памяти. Однако игнорируйте основные типы среды CLR, такие как object [], string и т. Д. Найдите, какие из ваших объектов (определенных как «не что-то в mscorlib или system.dll) есть, и выясните, какие корни Т.е. обычно легче отследить утечку с этого направления, даже если окажется, что вы пропускаете примитивные типы в своем приложении.

Обычно я отслеживаю управляемые утечки в CLR. , и он достаточно хорошо работает для большинства утечек.

4
ответ дан 16 December 2019 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: