Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GC.Collect 
V
    Опции темы
WarHog
Дата 5.2.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.10.2007
Где: Воронеж

Репутация: нет
Всего: 2



Цитата(emmanuil @ 5.2.2009,  14:17)
Обычный режим.
JIT-сгенирил все свою лабуду и корни в том числе. ...
Режим отладки.
JIT-сгенирил все свою лабуду и корни в том числе, плюс сгенерил еще и внутреннюю таблицу, исскуственные ссылки так сказать...

emmanuil, а разве в обычном режиме таблица корней не создается? ;)
--------------------
PM MAIL   Вверх
PashaPash
Дата 5.2.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



emmanuil, 
За временем жизни объекта следит GC. А что именно в данном месте кода является корнем - определяет JIT. Т.е. именно JIT при отладке продлевает время жизни переменной до конца метода. Умирает (не используется) переменная - объект потенциально может быть собран GC. GC.KeepAlive всего-лишь говорит JIT что "вот тут переменная еще используется".
Вот вопрос топикастера:
Цитата(v00d00 @  2.2.2009,  12:54 Найти цитируемый пост)
Что  делает метод GC.KeepAlive() я могу понять по документации, меня интересует как метод, который вызывается после завершения программы может препятсявовать удалению объекта сборщиком мусора? Сложилось впечатление что это деректива препроцессору...

Ответ на него - метод явно указывает JIT что надо продлить время жизни переменной до это этой строки. Продление времени жизни переменной вызывает продление времени жизни объекта, на который она ссылается. Человек хотел подробностей smile
Цитата(emmanuil @  5.2.2009,  14:17 Найти цитируемый пост)
JIT не занимается поиском смертников, для этого и создан сборщик и он управляет жизнью объекта так сказать.

JIT отдает сборщику указание что вот с этого места XXX больше не корень. Т.е. он определяет "не смертников" в пределах метода smile


--------------------
PM MAIL WWW   Вверх
emmanuil
Дата 5.2.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



WarHog, а ты читай внимательнее:
JIT-сгенирил все свою лабуду и корни в том числе, плюс сгенерил еще и внутреннюю таблицу, исскуственные ссылки так сказать...
Таблица то создается, но одна. А в отладке создается еще и внутренняя.
PM MAIL   Вверх
WarHog
Дата 5.2.2009, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.10.2007
Где: Воронеж

Репутация: нет
Всего: 2



emmanuil, эта внутренняя таблица с корнями и их байтовыми смещениями создается всегда, независимо от того, release или debug версия. это влияет только на байтовые смещения корней
--------------------
PM MAIL   Вверх
emmanuil
Дата 5.2.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



То
Цитата(PashaPash @  5.2.2009,  08:38 Найти цитируемый пост)
Насколько я знаю, сборщик мусора за временем жизни объектов не следит.

то
Цитата(PashaPash @  5.2.2009,  13:12 Найти цитируемый пост)
За временем жизни объекта следит GC.

Ну а я разве говорил, что сборщик делает корни и все такое? И JIT никого не информирует. Перевел в машинный, свои дела сделал всякие, указал корни и видимости, а вот удалять или нет объект решает сам сборщик, проходит, маркирует, удаляет, а потом воскресить даже может, там он не просто тупа проходит по корням как ты говорил, проходов несколько может быть.
Цитата(PashaPash @  5.2.2009,  13:12 Найти цитируемый пост)
JIT отдает сборщику указание что вот с этого места XXX больше не корень. Т.е. он определяет "не смертников" в пределах метода 
Ну не указания а что-то типо метки, что вот от сюда до сюда видно а дальше нет. А вот если на этот локально созданный объект начнет ссылаться поле из другого класса? Вот тут и считает сборщик ссылки. JIT генерирует код один раз, а сборщик работает всегда.
Цитата(PashaPash @  5.2.2009,  13:12 Найти цитируемый пост)
Ответ на него - метод явно указывает JIT что надо продлить время жизни переменной до это этой строки. Продление времени жизни переменной вызывает продление времени жизни объекта, на который она ссылается. Человек хотел подробностей 

а вот и подробности.
Цитата(emmanuil @  3.2.2009,  08:36 Найти цитируемый пост)
Он не подбирается сборщиком, потому что на него ссылка имеется при вызове метода GC.KeepAlive(mt). Вот поэтому он и живет до конца приложения, т.е. пока не закроется главная форма в твоем случае.А метод этот делает ссылку на указанный объект, делая его недоступным для сборщика мусора с момента начала текущей процедуры до вызова этого метода. Чтобы лучше понять это, нужно понять принципы работы GC.

Цитата(emmanuil @  4.2.2009,  15:59 Найти цитируемый пост)
Если бы ты использовал объект после закрытия гл. формы, то все время работы приложения он бы не уничтожился, так как на него будет ссылка.

Цитата(emmanuil @  4.2.2009,  16:46 Найти цитируемый пост)
 Переменная всего лишь хранит в себе ссылку, а сам объект лежит не в стеке, а в куче. После создания мутекса при отсутствии GC.KeepAlive(mt); на созданный объект больше не ссылается не одна переменная и поэтому сборщик уничтожает объект за ненадобностью.

Цитата(PashaPash @  5.2.2009,  13:12 Найти цитируемый пост)
JIT при отладке продлевает время жизни переменной до конца метода
Не переменной а объекта, путем создания внутренней таблицы и переменная тут не причем.

PM MAIL   Вверх
PashaPash
Дата 5.2.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(emmanuil @  5.2.2009,  16:25 Найти цитируемый пост)
WarHog, а ты читай внимательнее:
JIT-сгенирил все свою лабуду и корни в том числе, плюс сгенерил еще и внутреннюю таблицу, исскуственные ссылки так сказать...
Таблица то создается, но одна. А в отладке создается еще и внутренняя. 

Не создается никакой таблицы "искуственных ссылок". JIT создает ровно одну таблицу вида:
F0 7B          | 000B        reg EDI becoming live
5A             | 000D        reg EBX becoming live
F0 42          | 0017        reg EAX becoming live
72             | 0019        reg ESI becoming live
4A             | 001B        reg ECX becoming live
F0 03          | 0026        reg EAX becoming dead
...
06             | 0043        reg EAX becoming dead
08             | 0043        reg ECX becoming dead
10             | 0043        reg EDX becoming dead
4C             | 0047        reg ECX becoming live
0E             | 004D        reg ECX becoming dead
30             | 004D        reg ESI becoming dead
F1 1B          | 0060        reg EBX becoming dead
38             | 0060        reg EDI becoming dead
FF             | 
В дебаге dead в этой таблице смещаются ближе к концу - вот и весь фокус. GC работает c кодом уже после JIT, в нем нет никаких "переменных" и продлевать нечего. Есть стек и регистры и инфа от JIT корень/не корень.


--------------------
PM MAIL WWW   Вверх
emmanuil
Дата 5.2.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Цитата(WarHog @  5.2.2009,  14:31 Найти цитируемый пост)
emmanuil, эта внутренняя таблица с корнями и их байтовыми смещениями создается всегда, независимо от того, release или debug версия. это влияет только на байтовые смещения корн

с термином ошибся, согласен. выражал что исскуственные ссылки.
Цитата(emmanuil @  5.2.2009,  14:25 Найти цитируемый пост)
JIT-сгенирил все свою лабуду и корни в том числе, плюс сгенерил еще и внутреннюю таблицу, исскуственные ссылки так сказать...


Добавлено через 2 минуты и 25 секунд
Так ты уже определись smile
Цитата(PashaPash @  5.2.2009,  14:48 Найти цитируемый пост)
GC работает c кодом уже после JIT, в нем нет никаких "переменных" и продлевать нечего

или
Цитата(PashaPash @  5.2.2009,  13:12 Найти цитируемый пост)
Ответ на него - метод явно указывает JIT что надо продлить время жизни переменной до это этой строки. Продление времени жизни переменной вызывает продление времени жизни объекта, на который она ссылается. Человек хотел подробностей 


Добавлено через 11 минут и 56 секунд
Цитата(PashaPash @  5.2.2009,  14:48 Найти цитируемый пост)
Не создается никакой таблицы "искуственных ссылок"
Термином как уже говорил подобрал неудачный. Сдвиг байтов - а я назвал исскуственные ссылки.
PM MAIL   Вверх
PashaPash
Дата 5.2.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(emmanuil @  5.2.2009,  16:45 Найти цитируемый пост)

Ну а я разве говорил, что сборщик делает корни и все такое? И JIT никого не информирует. Перевел в машинный, свои дела сделал всякие, указал корни и видимости, а вот удалять или нет объект решает сам сборщик, проходит, маркирует, удаляет, а потом воскресить даже может, там он не просто тупа проходит по корням как ты говорил, проходов несколько может быть.

Нет, не решает. Если объект в 0 поколении, без финализера, и нет живых корней - то его удалит всегда. Есть корни или нет в конкретной точке  - решает JIT. Продлевает их в debug - тоже JIT.
Цитата(emmanuil @  5.2.2009,  16:45 Найти цитируемый пост)
Не переменной а объекта, путем создания внутренней таблицы и переменная тут не причем.

Приведи, пожалуйста, хоть какое-то подтверждение существования дополнительной внутренней таблицы ссылок.

Цитата(emmanuil @  5.2.2009,  16:45 Найти цитируемый пост)
Он не подбирается сборщиком, потому что на него ссылка имеется при вызове метода GC.KeepAlive(mt). Вот поэтому он и живет до конца приложения, т.е. пока не закроется главная форма в твоем случае.А метод этот делает ссылку на указанный объект, делая его недоступным для сборщика мусора с момента начала текущей процедуры до вызова этого метода. Чтобы лучше понять это, нужно понять принципы работы GC.

Да, все отлично, используется переменная и все такое. Я как бы и не пытался это опровергнуть. Вот только спорим мы вот об этом:
Цитата(PashaPash @  4.2.2009,  21:14 Найти цитируемый пост)
В debug JIT продлевает время жизни переменной до ее scope - чтобы в отладке можно было посмотреть значение после последнего использования. В release время жизни значительно сокращается smile 

Цитата(emmanuil @  5.2.2009,  05:44 Найти цитируемый пост)

На сколько я знаю, то JIT это способ компиляции и JIT  компиляторы. А за временем жизни объектов следит CLR - сборщик мусора. Как с этим справляется IDE мне доподленно не известно, возможно для переменных хранит ссылки на них во время отладки для показана сведений по ним. 

Я подробно расписал как и кто справляется с "этим". Дал линк, пару раз еще тут подробно описал. А ты все еще утверждаешь что 
Цитата(emmanuil @  5.2.2009,  16:45 Найти цитируемый пост)
Не переменной а объекта, путем создания внутренней таблицы и переменная тут не причем.

JIT явно говорит GC что конкретный регистр (переменная) или кусок стека "не корень со строчки XXX". Говорит в терминологии alive/dead. Т.е. он натурально обманывает GC и говорит что значение в регистре - переменная ссылочного типа - живет дольше чем на самом деле должна. И не надо тут никакие внутренние временные таблицы ссылок притягивать за уши smile

Добавлено через 1 минуту и 9 секунд
Ок, пофлеймили, размяли пальцы, работаем дальше smile

Добавлено через 3 минуты и 20 секунд
Цитата(emmanuil @  5.2.2009,  16:53 Найти цитируемый пост)
GC работает c кодом уже после JIT, в нем нет никаких "переменных" и продлевать нечего

Цитата(emmanuil @  5.2.2009,  16:53 Найти цитируемый пост)
Ответ на него - метод явно указывает JIT что надо продлить время жизни переменной до это этой строки. Продление времени жизни переменной вызывает продление времени жизни объекта, на который она ссылается. Человек хотел подробностей 

JIT видит код и до себя и после себя smile И продлевает время жизни того, во что превращаются переменные, в том, во что он их превращает smile GC видит только код после JIT, и полностью верит JIT в плане того, что в данный момент живое, а что нет. И самостоятельно выбор не делает, тупо собирает и все smile


--------------------
PM MAIL WWW   Вверх
emmanuil
Дата 5.2.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Цитата(PashaPash @  5.2.2009,  15:06 Найти цитируемый пост)
Приведи, пожалуйста, хоть какое-то подтверждение существования дополнительной внутренней таблицы ссылок.
На счет этого писал.
Цитата(PashaPash @  5.2.2009,  15:06 Найти цитируемый пост)
JIT явно говорит GC что конкретный регистр (переменная) или кусок стека "не корень со строчки XXX". Говорит в терминологии alive/dead. Т.е. он натурально обманывает GC и говорит что значение в регистре - переменная ссылочного типа - живет дольше чем на самом деле должна. И не надо тут никакие внутренние временные таблицы ссылок притягивать за уши 
Как уже писал делает исскуственные ссылки, дабы продлить жизнь.
Если корень перестает быть корнем, это не занчит что именно там удалится объект. Корень это всего лишь адрес на объект в куче. ссылаться могут многие переменные на один объект. При сборе сборщик проверяет корни и маркирует. И только после это немаркированные объекты могут быть удалены.


Это сообщение отредактировал(а) emmanuil - 5.2.2009, 17:57
PM MAIL   Вверх
PashaPash
Дата 5.2.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(emmanuil @  5.2.2009,  17:44 Найти цитируемый пост)
Как уже писал делает исскуственные ссылки, дабы продлить жизнь.

Более точно - продлевает жизнь настоящей ссылки. Он не создает доп. копию и не создает никаких внутренних таблиц. Ссылка как лежала в регистре, так и лежит, только GC не уведомляют вовремя что регистр уже не корень.
Цитата(emmanuil @  5.2.2009,  17:44 Найти цитируемый пост)
Если корень перестает быть корнем, это не занчит что именно там удалится объект. Корень это всего лишь адрес на объект в куче. ссылаться могут многие переменные на один объект. При сборе сборщик проверяет корни и маркирует. И только после это немаркированные объекты могут быть удалены.

Ну чтобы совсем точно - если в умершем корне лежала единственная ссылка на объект нулевого поколения и наступила сборка мусора [тут стандартные условия при которых объекты не удаляются] объект будет удален. Мы как бы не о сборке мусора спорим, которую все давно в рихтере прочитали. Спорим о том, почему именно переменные-ссылки и объекты, на которые они ссылаются, в дебаге доживают до конца метода, когда формально самих ссылок после последнего использования уже нет. Я утверждаю что этим занимается JIT, обманывая сборщик мусора и не показывая ему настоящее положение вещей. Ты чем-то не согласен с этим утверждением и пытаешься пропихнуть модель с внутренними таблицами и искуственными ссылками.  Продолжаем.. smile


--------------------
PM MAIL WWW   Вверх
emmanuil
Дата 5.2.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Цитата(PashaPash @  5.2.2009,  16:24 Найти цитируемый пост)
только GC не уведомляют вовремя что регистр уже не корень.
Да сборщика вообще не уведомляют. Он сам проверяет корни когда ничинается сборка.
Цитата(PashaPash @  5.2.2009,  16:24 Найти цитируемый пост)
Ну чтобы совсем точно - если в умершем корне лежала единственная ссылка на объект нулевого поколения и наступила сборка мусора [тут стандартные условия при которых объекты не удаляются] объект будет удален
Ну а кто тут с тобой спорит. Но. То ты говоришь что JIT рулит временем жизни, а теперь что условия стандартные и умерший корень...JIT сделал корень, обозначил отсюда до сюда живой и все, а там уже сборщик сам проверяет ссылки на объект. и если в одном месте корень умер, то может быть живой в другом месте и это проверит уже сборщик при обходе и никакой ни JIT.
Цитата(PashaPash @  5.2.2009,  16:24 Найти цитируемый пост)
Я утверждаю что этим занимается JIT, обманывая сборщик мусора и не показывая ему настоящее положение вещей. Ты чем-то не согласен с этим утверждением и пытаешься пропихнуть модель с внутренними таблицами и искуственными ссылками.  Продолжаем.. 
Вот с таблицами я ошибся, уже писал что я имел в виду.
Цитата(PashaPash @  5.2.2009,  16:24 Найти цитируемый пост)
. Спорим о том, почему именно переменные-ссылки и объекты, на которые они ссылаются, в дебаге доживают до конца метода, когда формально самих ссылок после последнего использования уже нет. 
 спорим не поэтому, потому как я писал что обманывает сам себя, объяснил с таблицами. а спорим потому что ты все никак прочитатьне можешь
Цитата(emmanuil @  5.2.2009,  14:53 Найти цитируемый пост)
Термином как уже говорил подобрал неудачный. Сдвиг байтов - а я назвал исскуственные ссылки.

Я начал спор не поэтому, я честно сказал что доподленно незнаю как в дебаге там и почему.
Цитата(PashaPash @  5.2.2009,  08:38 Найти цитируемый пост)
Насколько я знаю, сборщик мусора за временем жизни объектов не следит.
но потом ты всетаки сказал
Цитата(PashaPash @  5.2.2009,  13:12 Найти цитируемый пост)
За временем жизни объекта следит GC

Цитата(PashaPash @  5.2.2009,  08:38 Найти цитируемый пост)
 И именно JIT дает GC список смертников - GC Info
И вот из-за этого тоже. ну еще раз напишу, JIT сборщику никакого списка не дает, он делает корни и видимости а сборщик уже сам там разбирается кого надо удалять а кого нет. Потом ты вроде как со всем этим согласился и плавно переместился на мою ошибочку про таблицы, но и там я ошибся только в терминологии и не вел себя как флюгер:
Цитата(PashaPash @  5.2.2009,  08:38 Найти цитируемый пост)
Насколько я знаю, сборщик мусора за временем жизни объектов не следит.
но потом ты всетаки сказал
Цитата(PashaPash @  5.2.2009,  13:12 Найти цитируемый пост)
За временем жизни объекта следит GC

Дискутировать дальше не вижу смысла, так как ты уже начал из-за терминов спорить. Тема закрыта.

PM MAIL   Вверх
PashaPash
Дата 5.2.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Не надо даблквотинга. Все равно ведь флеймовая тема. smile
 Лучше вот на мой единственный вопрос на форуме ответь, про XmlSerializer :(


--------------------
PM MAIL WWW   Вверх
v00d00
Дата 6.2.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 28.12.2005

Репутация: нет
Всего: нет



Не знаю, имеет ли смысл здесь еще постить, однако провел эксперимент:

объявил функцию:
Код

private static void KeepAlive(object o)
        {
            o.GetHashCode();
        }


в релизной версии результат такой же что и от применения аналогичной функции GC.KeepAlive()

Сборшик анализируте не только сегмент стека, но и сегмент кода. Это все что я хотел узнать.
PM MAIL   Вверх
Partizan
Дата 6.2.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



v00d00, имхо не обман сборщика мусора, а просто сборщик мусора не будет удалять объект, потому что он реально используется...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
emmanuil
Дата 6.2.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Цитата(Partizan @  6.2.2009,  11:21 Найти цитируемый пост)
v00d00, имхо не обман сборщика мусора, а просто сборщик мусора не будет удалять объект, потому что он реально используется...
Вот именно. Сборщик просто видит, что объект еще дальще используется и не удаляет его.

PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0617 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.