Oberon space

General Category => Общий раздел => Тема начата: vlad от Март 14, 2012, 01:15:11 pm

Название: Утечки памяти
Отправлено: vlad от Март 14, 2012, 01:15:11 pm
Что можно почитать про ловлю утечек памяти (в условиях GC)? Какие подходы существуют и все такое. А то как-то неэффективно у меня это получается...
Название: Re: Утечки памяти
Отправлено: Peter Almazov от Март 14, 2012, 01:40:33 pm
JScript?
Название: Re: Утечки памяти
Отправлено: vlad от Март 14, 2012, 02:36:42 pm
JScript?

Угу.
Название: Re : Утечки памяти
Отправлено: valexey от Март 14, 2012, 03:13:11 pm
На самом деле думаю что у Влада JavaScript (http://ru.wikipedia.org/wiki/JavaScript) (js) а не JScript (http://ru.wikipedia.org/wiki/JScript). :-)
Название: Re: Re : Утечки памяти
Отправлено: vlad от Март 14, 2012, 03:39:06 pm
На самом деле думаю что у Влада JavaScript (http://ru.wikipedia.org/wiki/JavaScript) (js) а не JScript (http://ru.wikipedia.org/wiki/JScript). :-)

Применительно к сабжу - разницы никакой :) Проблема имеет место быть для всех языков с GC. Соответственно, должны быть какие-то наработки. Но попробую сузить проблему применительно к моему случаю.

Есть два слепка памяти - до и после утечки. В новом появились новые объекты. Нужно найти цепочки, которые ведут от "новых" объектов к общему руту со "старыми". Подход "смотрим кто ссылается на этот объект, потом кто ссылается на ссылающегося и т.д." не работает, потому что много циклических ссылок. Что именно за объект - не всегда можно сказать (особенности жабаскрипта).
Название: Re: Re : Утечки памяти
Отправлено: valexey от Март 14, 2012, 03:43:44 pm
На самом деле думаю что у Влада JavaScript (http://ru.wikipedia.org/wiki/JavaScript) (js) а не JScript (http://ru.wikipedia.org/wiki/JScript). :-)

Применительно к сабжу - разницы никакой :) Проблема имеет место быть для всех языков с GC. Соответственно, должны быть какие-то наработки. Но попробую сузить проблему применительно к моему случаю.

Есть два слепка памяти - до и после утечки. В новом появились новые объекты. Нужно найти цепочки, которые ведут от "новых" объектов к общему руту со "старыми". Подход "смотрим кто ссылается на этот объект, потом кто ссылается на ссылающегося и т.д." не работает, потому что много циклических ссылок. Что именно за объект - не всегда можно сказать (особенности жабаскрипта).

Рисовать это дело не пробовал? То есть визуализировать.
Название: Re : Утечки памяти
Отправлено: valexey от Март 14, 2012, 03:50:24 pm
Вообще, по сути твои утечки памяти, как я понимаю, это логические утечки (осталась ссылка на мусор в неком долгоживущем объекте (например в гуе)). Соответственно не понятно что ты хочешь увидеть в гипотетической тулзе которая эти утечки ловит.

Из вариантов - завести можно например флажог в объектах и при явном "удалении" объекта (dispose) выставлять этот флажок, что мол все. Нинужен. Затем можно например вывести список всех объектов с выставленным флажком и смотреть какой гад на них ссылается.
Название: Re: Re : Утечки памяти
Отправлено: vlad от Март 14, 2012, 03:52:03 pm
Рисовать это дело не пробовал? То есть визуализировать.

Пробовал с помощью http://www.graphviz.org/. Слишком много объектов. Даже на тесте - после нескольких минут генерирования картинки - картинка бесполезна. Надо существенно прорежать, но как - тоже непонятно.
Название: Re: Утечки памяти
Отправлено: valexey от Март 14, 2012, 03:55:15 pm
Рисовать это дело не пробовал? То есть визуализировать.

Пробовал с помощью http://www.graphviz.org/. Слишком много объектов. Даже на тесте - после нескольких минут генерирования картинки - картинка бесполезна. Надо существенно прорежать, но как - тоже непонятно.
Ну, собственно методика прореживания описана мною выше :-)
Название: Re: Re : Утечки памяти
Отправлено: vlad от Март 14, 2012, 04:01:47 pm
Вообще, по сути твои утечки памяти, как я понимаю, это логические утечки (осталась ссылка на мусор в неком долгоживущем объекте (например в гуе)).

Нет, ссылки "извне" пока неактуальны - течет не из-за них, а за счет того, что оно зарутано в глобальном жабаскриптовом объекте.

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

Собственно я попытался описать - найти цепочку/путь от утекшего объекта объекта (я его знаю) до рута, который ее держит. В общем случае таких рутов может быть больше одного.


Из вариантов - завести можно например флажог в объектах и при явном "удалении" объекта (dispose) выставлять этот флажок, что мол все. Нинужен. Затем можно например вывести список всех объектов с выставленным флажком и смотреть какой гад на них ссылается.

Флажок не сильно поможет. Потому что ссылок на объект может быть очень много (со стороны его же потрохов). При этом реально держит его какая-то одна внешняя по отношению к этому объекту.
Название: Re: Утечки памяти
Отправлено: Peter Almazov от Март 14, 2012, 04:51:40 pm
А как запускается Javascript? Если под браузером, то под каким?
Название: Re: Утечки памяти
Отправлено: valexey от Март 14, 2012, 04:53:37 pm
А как запускается Javascript? Если под браузером, то под каким?
Сколь я помню, у Влада используется движок Gecko. Но не в браузере.
Название: Re: Утечки памяти
Отправлено: vlad от Март 14, 2012, 05:17:58 pm
А как запускается Javascript? Если под браузером, то под каким?
Сколь я помню, у Влада используется движок Gecko. Но не в браузере.

Да, это встроенный мозилловский движок.
Название: Re: Утечки памяти
Отправлено: Губанов Сергей Юрьевич от Март 15, 2012, 06:26:37 am
Тебе хочется один раз (сейчас) найти где течёт или хочется встроить в программу профайлер объектов чтобы никогда больше не приходилось искать ибо сама программа это будет диагностировать?

Я на работе встроил в программу (C#) профайлер объектов. Раз в минуту обхожу все объекты (отнаследованные от соответствующего класса) вывожу в файл статистику. Правда граф связей пока не строю, хватает знать какого типа объекты текут. Но можно прикрутить и построение графа, чтобы программа сама же и показывала не только что течёт, но и через какую дырку.
Название: Re: Утечки памяти
Отправлено: vlad от Март 15, 2012, 11:25:47 am
Тебе хочется один раз (сейчас) найти где течёт или хочется встроить в программу профайлер объектов чтобы никогда больше не приходилось искать ибо сама программа это будет диагностировать?

Я на работе встроил в программу (C#) профайлер объектов. Раз в минуту обхожу все объекты (отнаследованные от соответствующего класса) вывожу в файл статистику. Правда граф связей пока не строю, хватает знать какого типа объекты текут. Но можно прикрутить и построение графа, чтобы программа сама же и показывала не только что течёт, но и через какую дырку.

Меня устроил бы и такой вариант. Но я сомневаюсь в наличии универсального решения. Сама программа сильно разная (жабаскрипт же ш - кастомизация под конкретный случай, от меня не зависит, меня привлекают, когда оно падает с out of memory). Кроме того, понятие "наследования" в жабаскрипте весьма условно (да, я знаю, такой говенный язык).