Re[9]: WPF. Финализаторы не вызываются. Утечка памяти
От: takTak  
Дата: 15.06.20 09:56
Оценка:
T>>как вообще происходит "быстрое выжирание пулов поколений"

НС>Путем быстрого выделения большого количества объектов.


T>>и почему gc.collect этому "выжиранию" препятствует?


НС>Потому что останавливает выделение и дает отработать финалайзерам.



для меня лично такое- это откровенный баг: если автоматическое управление памятью с выделением памяти под большие обьекты справляется, а с выделением паняти под маленькие объекты не справляется, то это — полная ерунда ...
Re[8]: WPF. Финализаторы не вызываются. Утечка памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 15.06.20 10:00
Оценка:
Здравствуйте, takTak, Вы писали:

T>>>проблема в сочетании деконструктора и небольшого массива внутри объекта


НС>>Нет. Проблема в большом количестве финализаторов и быстром выжирании пулов поколений.


T>ну да, похоже на такое...


T>как вообще происходит "быстрое выжирание пулов поколений" и почему gc.collect этому "выжиранию" препятствует?

gc.collect как раз и переводит из поколения в поколение. Со старшими поколениями видно и происходит проблема с финализаторами.
Там считается если уж попал во 2 е поколение то это на долго.
А GC.WaitForPendingFinalizers(); принудительно дожидается пока все финализаторы не сработают
и солнце б утром не вставало, когда бы не было меня
Re[10]: WPF. Финализаторы не вызываются. Утечка памяти
От: Ночной Смотрящий Россия  
Дата: 15.06.20 10:26
Оценка:
Здравствуйте, takTak, Вы писали:

T>для меня лично такое- это откровенный баг


Для тебя лично. Этому поведению уже 20 лет скоро.

T>: если автоматическое управление памятью с выделением памяти под большие обьекты справляется, а с выделением паняти под маленькие объекты не справляется, то это — полная ерунда ...


Полная ерунда это писать финалайзеры не соображая как это работает. Сама идея делать финалайзеры без неуправляемых ресурсов уже бред.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[11]: WPF. Финализаторы не вызываются. Утечка памяти
От: takTak  
Дата: 15.06.20 11:06
Оценка:
T>>для меня лично такое- это откровенный баг

НС>Для тебя лично. Этому поведению уже 20 лет скоро.


T>>: если автоматическое управление памятью с выделением памяти под большие обьекты справляется, а с выделением паняти под маленькие объекты не справляется, то это — полная ерунда ...


НС>Полная ерунда это писать финалайзеры не соображая как это работает. Сама идея делать финалайзеры без неуправляемых ресурсов уже бред.



так я лично поэтому всегда Dispose и пользовался, краем уха слышал, что пользоваться finalizer не стоит...

так нафига finalizer воообще, если это банально не работает ?
Re[12]: WPF. Финализаторы не вызываются. Утечка памяти
От: Ночной Смотрящий Россия  
Дата: 15.06.20 11:15
Оценка:
Здравствуйте, takTak, Вы писали:

T>так нафига finalizer воообще, если это банально не работает ?


Для неуправляемых ресурсов и умеющих ими правильно пользоваться.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[12]: WPF. Финализаторы не вызываются. Утечка памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 15.06.20 12:24
Оценка:
Здравствуйте, takTak, Вы писали:

НС>>Полная ерунда это писать финалайзеры не соображая как это работает. Сама идея делать финалайзеры без неуправляемых ресурсов уже бред.



T>так я лично поэтому всегда Dispose и пользовался, краем уха слышал, что пользоваться finalizer не стоит...


T>так нафига finalizer воообще, если это банально не работает ?


https://habr.com/ru/post/89720/
и солнце б утром не вставало, когда бы не было меня
Re[7]: WPF. Финализаторы не вызываются. Утечка памяти
От: bnk СССР http://unmanagedvisio.com/
Дата: 15.06.20 12:37
Оценка: +2
Здравствуйте, takTak, Вы писали:

S>>Мы говорим не о литературном русском языке, а о терминологии производителя. Деструкторов в CLR нет, т.к. деструктор подразумевает детерминистическую финализацию.


T>другие люди почему-то используют...


И они не правы, потому что слово "finalizer" для того и придумали, чтобы избежать слова "destructor".
Re: WPF. Финализаторы не вызываются. Утечка памяти
От: Слава  
Дата: 15.06.20 12:44
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>В продолжении темы http://rsdn.org/forum/dotnet/7753095.1
Автор: igor-booch
Дата: 13.06.20

IB>Создал минимальное воспроизводящее приложение.

Мне кажется, что в оригинальном вопросе у вас в финализаторе освобождалось что-то другое. Зачем вам финализатор, если у вас нет неуправляемых ресурсов?
Re[8]: WPF. Финализаторы не вызываются. Утечка памяти
От: takTak  
Дата: 15.06.20 12:56
Оценка:
S>>>Мы говорим не о литературном русском языке, а о терминологии производителя. Деструкторов в CLR нет, т.к. деструктор подразумевает детерминистическую финализацию.

T>>другие люди почему-то используют...


bnk>И они не правы, потому что слово "finalizer" для того и придумали, чтобы избежать слова "destructor".



имхо никакого смысла плодить ненужные сущности нет: могли назвать недерминистическим дестрактором, тогда всем было бы всё понятно,
а чего стоит их "selectMany" в linq !? Поубибав бы(c)
Re[8]: WPF. Финализаторы не вызываются. Утечка памяти
От: _NN_ www.nemerleweb.com
Дата: 15.06.20 13:15
Оценка: +1
Здравствуйте, bnk, Вы писали:

bnk>И они не правы, потому что слово "finalizer" для того и придумали, чтобы избежать слова "destructor".


Ага, слово то дали другое, а синтаксис в C# скопирован с деструкторов.
Лучше бы как в Java пиши полностью: public override void Finalize(), тогда бы и меньше людей пихало бы в код финализаторов.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[9]: WPF. Финализаторы не вызываются. Утечка памяти
От: bnk СССР http://unmanagedvisio.com/
Дата: 15.06.20 13:21
Оценка:
Здравствуйте, _NN_, Вы писали:

bnk>>И они не правы, потому что слово "finalizer" для того и придумали, чтобы избежать слова "destructor".


_NN>Ага, слово то дали другое, а синтаксис в C# скопирован с деструкторов.

_NN>Лучше бы как в Java пиши полностью: public override void Finalize(), тогда бы и меньше людей пихало бы в код финализаторов.

Компромисс? Людям нужны знакомые вещи, пусть они немного и не такие какими кажутся

https://youtu.be/wIHfaH9Kffs
Re[10]: WPF. Финализаторы не вызываются. Утечка памяти
От: takTak  
Дата: 15.06.20 13:25
Оценка: :)))
bnk>>>И они не правы, потому что слово "finalizer" для того и придумали, чтобы избежать слова "destructor".

_NN>>Ага, слово то дали другое, а синтаксис в C# скопирован с деструкторов.

_NN>>Лучше бы как в Java пиши полностью: public override void Finalize(), тогда бы и меньше людей пихало бы в код финализаторов.

bnk>Компромисс? Людям нужны знакомые вещи, пусть они немного и не такие какими кажутся


ага, если что-то выглядит как утка, но то мяукуает, то хрюкает, то как это назвать ?
Re[2]: WPF. Финализаторы не вызываются. Утечка памяти
От: igor-booch Россия  
Дата: 15.06.20 13:51
Оценка:
Здравствуйте, Слава, Вы писали:

С>Здравствуйте, igor-booch, Вы писали:


IB>>В продолжении темы http://rsdn.org/forum/dotnet/7753095.1
Автор: igor-booch
Дата: 13.06.20

IB>>Создал минимальное воспроизводящее приложение.

С>Мне кажется, что в оригинальном вопросе у вас в финализаторе освобождалось что-то другое. Зачем вам финализатор, если у вас нет неуправляемых ресурсов?

Это модельное (не реальное приложение). Я его создал, что хоть как-то продемонстрировать проблему. В реальной приложении финализатор не пустой и нет бесконечных циклов в конструкторе, но утечка памяти такая же.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[6]: WPF. Финализаторы не вызываются. Утечка памяти
От: pilgrim_ Россия  
Дата: 15.06.20 15:24
Оценка: 74 (1)
Здравствуйте, Sinclair, Вы писали:

S>Мы говорим не о литературном русском языке, а о терминологии производителя. Деструкторов в CLR нет, т.к. деструктор подразумевает детерминистическую финализацию.


Тем не менее в спецификации C# деструкторы есть : https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#destructors
Re[7]: WPF. Финализаторы не вызываются. Утечка памяти
От: _NN_ www.nemerleweb.com
Дата: 16.06.20 04:59
Оценка:
Здравствуйте, pilgrim_, Вы писали:

_>Здравствуйте, Sinclair, Вы писали:


S>>Мы говорим не о литературном русском языке, а о терминологии производителя. Деструкторов в CLR нет, т.к. деструктор подразумевает детерминистическую финализацию.


_>Тем не менее в спецификации C# деструкторы есть : https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#destructors


Ага. Повбивав би
Дать название из C++, а поведение совсем не такое как у деструкторов из C++:

Execution of the destructor for the instance may occur at any time after the instance becomes eligible for destruction.
When an instance is destructed, the destructors in that instance's inheritance chain are called, in order, from most derived to least derived.
A destructor may be executed on any thread.



И ещё масла в огонь

Finalizers (which are also called destructors)

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/destructors
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: WPF. Финализаторы не вызываются. Утечка памяти
От: alexzzzz  
Дата: 16.06.20 11:22
Оценка:
Здравствуйте, Слава, Вы писали:

С>Мне кажется, что в оригинальном вопросе у вас в финализаторе освобождалось что-то другое. Зачем вам финализатор, если у вас нет неуправляемых ресурсов?


Не касаясь оригинальной задачи, пример использования финализаторов без неуправляемых ресурсов — контролировать утечки из пула.

Есть пул объектов (или их дорого инициализировать, или они большие и хочется переиспользовать память в LOH). Если при выдаче из пула подписывать объект на финализацию, а при возвращении в пул отписывать, а в финализатор вставить логирование, то вызов GC.Collect+WaitForPendingFinalizers покажет, а не утекло ли у нас что-то мимо пула.
Re[7]: WPF. Финализаторы не вызываются. Утечка памяти
От: alexzzzz  
Дата: 16.06.20 11:32
Оценка: +1
Здравствуйте, takTak, Вы писали:

T>не, даже без вложенного массива комбинация деконструктора и бесконечного цикла ведёт к outofmemory,

T>хотя в finalizer программа регулярно заходит

Объекты создаются в цикле быстрее, чем поток финализации успевает обрабатывать их финализаторы, а GC не может убивать старые объекты, пока их финализаторы не отработали.
Re[8]: WPF. Финализаторы не вызываются. Утечка памяти
От: takTak  
Дата: 16.06.20 11:44
Оценка:
T>>не, даже без вложенного массива комбинация деконструктора и бесконечного цикла ведёт к outofmemory,
T>>хотя в finalizer программа регулярно заходит

A>Объекты создаются в цикле быстрее, чем поток финализации успевает обрабатывать их финализаторы, а GC не может убивать старые объекты, пока их финализаторы не отработали.


так проблема для меня лично не столько в этом, а в том, что деструкторы больших по размеру объектов при всём этом без проблем работают : получается противоречивое поведение, когда программа ведёт себя различно в зависимости лишь от разницы в размере данных
Re[9]: WPF. Финализаторы не вызываются. Утечка памяти
От: alexzzzz  
Дата: 16.06.20 12:11
Оценка:
Здравствуйте, takTak, Вы писали:

A>>Объекты создаются в цикле быстрее, чем поток финализации успевает обрабатывать их финализаторы, а GC не может убивать старые объекты, пока их финализаторы не отработали.

T>так проблема для меня лично не столько в этом, а в том, что деструкторы больших по размеру объектов при всём этом без проблем работают

Повод измерить и сравнить скорость выделения 10кб в нулевом поколении и 100кб в large object heap. Если во втором случае заметно дольше, то финализаторы успевают отрабатывать.

T>>> получается противоречивое поведение, когда программа ведёт себя различно в зависимости лишь от разницы в размере данных


Это очевидная зависимость. Выдели на стеке буфер в мегабайт, а потом в десять мегабайт. Во втором случае будет StackOverflow. Ну, сам виноват, не уследил за размерами. И конечно большие объёмы данных обрабатывать дольше, чем маленькие ― скорость работы программы не может не отличаться.
Отредактировано 16.06.2020 12:13 alexzzzz . Предыдущая версия . Еще …
Отредактировано 16.06.2020 12:12 alexzzzz . Предыдущая версия .
Re[10]: WPF. Финализаторы не вызываются. Утечка памяти
От: takTak  
Дата: 16.06.20 12:18
Оценка:
A>>>Объекты создаются в цикле быстрее, чем поток финализации успевает обрабатывать их финализаторы, а GC не может убивать старые объекты, пока их финализаторы не отработали.
T>>так проблема для меня лично не столько в этом, а в том, что деструкторы больших по размеру объектов при всём этом без проблем работают

A>Повод измерить и сравнить скорость выделения 10кб в нулевом поколении и 100кб в large object heap. Если во втором случае заметно дольше, то финализаторы успевают отрабатывать.


T>>>> получается противоречивое поведение, когда программа ведёт себя различно в зависимости лишь от разницы в размере данных


A>Это очевидная зависимость. Выдели на стеке буфер в мегабайт, а потом в десять мегабайт. Во втором случае будет StackOverflow. Ну, сам виноват, не уследил за размерами. И конечно большие объёмы данных обрабатывать дольше, чем маленькие ― скорость работы программы не может не отличаться.


речь ж не о скорости, а о том, что программа принципиально работает различно в зависисмости лишь от небольшой разницы в размере данных: 85к и меньше — не работает, 85к и больше(это даже не один мегабайт, карл!) — работает
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.