1 / 1 / 1
Регистрация: 06.05.2011
Сообщений: 110
|
|
1 | |
HeapWalk() и managed heap. Может ли само приложение в какой-то точке своего кода запросить список своих объектов30.11.2013, 15:13. Показов 975. Ответов 5
Метки нет (Все метки)
Для неуправляемого кода существуют функции для получения информации об объектах, находящихся в куче. Например, HeapWalk() и все, что с ним связано. А можно ли их приспособить для перечисления объектов, созданных приложением операцией new в Managed Heap? Если нет, то как такое перечисление может быть сделано программно? Я имею в виду не утилиты вроде CLR Profiling API, которая бы следила за приложениями, запущенными в системе, а более простое дело - может ли само приложение в какой-то точке своего кода запросить список СВОИХ объектов, существующих в данный момент в Managed Heap?
0
|
30.11.2013, 15:13 | |
Ответы с готовыми решениями:
5
Добавление своих объектов в двунаправленный список Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
1 / 1 / 1
Регистрация: 06.05.2011
Сообщений: 110
|
|
30.11.2013, 15:50 [ТС] | 3 |
Вот для чего : скажем, создаю в каком-нибудь методе-обработчике нажатия кнопки объект-форму-диалог с помощью new : MyForm dlg = new MyForm(); dlg.ShowDialog(). Пусть диалог отработал, закрылся, из из метода, где диалог создавался, мы вышли. Сборщик мусора рано или поздно должен этот объект удалить (или нет?). А вот если в форме MyForm был создан Forms.Timer таймер и включен, и при закрытии диалога мы его не остановили, то тогда объект диалога не будет удален даже если снова войти в обработчик и создать новый диалог MyForm dlg = new MyForm().
Так и будут копиться объекты диалога при каждом входе в диалог и плодиться таймеры. А если таймеров нет - то тогда, наверное, объекты диалога плодиться не будут (?). Но это все мои предположения - хотелось бы (в учебных целях) убедиться программно, и для этого иметь метод, получающий в желаемый момент список объектов в Manage Heap. Безусловно, я и хотел воспользоваться GC, который определяет живые объекты, но вроде не нашел у него методов, возвращающих нужную информацию. Не знаю, как это сделать с помощью GC
0
|
Master of Orion
|
|
30.11.2013, 16:31 | 4 |
Владимир В, удаляется любой объект, на который нет ссылок. Так что ничего не копится. Ни таймеры, ни диалоги. Если только не забывать Dispose вызывать. Покажите код, который у вас вопросы вызывает.
Добавлено через 39 минут Владимир В, и кстати, судя по всему, это невозможно (Я на СО спросил), ответ:
0
|
1 / 1 / 1
Регистрация: 06.05.2011
Сообщений: 110
|
|
30.11.2013, 16:34 [ТС] | 5 |
Правильно, если вызывать Dispose. Но я хотел убедиться, что если не вызывать, то сборщик мусора через какое-то время все равно должен объект убрать. Сделал пример, в котором диалог вызывается из формы, и считал, что после выхода из обработчика, где диалог создавался, ссылка на него приложению уже не нужна. В крайнем случае она
станет ненужной после повторного вызова обработчика, в котором создается и вызывается диалог. Но в самой форме диалога у меня был запущен таймер, который я случайно не остановил - и в таком случае сборщик мусора не будет удалять такие диалоги, и они (уже невидимые) будут копиться и все их таймеры работать. Это я и заметил визуально. Для этого не нужно анализировать Heap, работающие таймеры сами это покажут. Если таймер останавливать при закрытии диалога, то даже без Dispose сборщик мусора должен объект убрать. Но вопрос не в этом. Как с помощью GC запросить информацию о живых объектах приложения? Чтобы, к примеру, по этому списку увидеть, что в одном случае диалоги копятся, в другом нет, если делать Dispose и не делать - и т.д.
0
|