Oberon space
General Category => Общий раздел => Тема начата: vlad от Март 14, 2012, 01:15:11 pm
-
Что можно почитать про ловлю утечек памяти (в условиях GC)? Какие подходы существуют и все такое. А то как-то неэффективно у меня это получается...
-
JScript?
-
JScript?
Угу.
-
На самом деле думаю что у Влада JavaScript (http://ru.wikipedia.org/wiki/JavaScript) (js) а не JScript (http://ru.wikipedia.org/wiki/JScript). :-)
-
На самом деле думаю что у Влада JavaScript (http://ru.wikipedia.org/wiki/JavaScript) (js) а не JScript (http://ru.wikipedia.org/wiki/JScript). :-)
Применительно к сабжу - разницы никакой :) Проблема имеет место быть для всех языков с GC. Соответственно, должны быть какие-то наработки. Но попробую сузить проблему применительно к моему случаю.
Есть два слепка памяти - до и после утечки. В новом появились новые объекты. Нужно найти цепочки, которые ведут от "новых" объектов к общему руту со "старыми". Подход "смотрим кто ссылается на этот объект, потом кто ссылается на ссылающегося и т.д." не работает, потому что много циклических ссылок. Что именно за объект - не всегда можно сказать (особенности жабаскрипта).
-
На самом деле думаю что у Влада JavaScript (http://ru.wikipedia.org/wiki/JavaScript) (js) а не JScript (http://ru.wikipedia.org/wiki/JScript). :-)
Применительно к сабжу - разницы никакой :) Проблема имеет место быть для всех языков с GC. Соответственно, должны быть какие-то наработки. Но попробую сузить проблему применительно к моему случаю.
Есть два слепка памяти - до и после утечки. В новом появились новые объекты. Нужно найти цепочки, которые ведут от "новых" объектов к общему руту со "старыми". Подход "смотрим кто ссылается на этот объект, потом кто ссылается на ссылающегося и т.д." не работает, потому что много циклических ссылок. Что именно за объект - не всегда можно сказать (особенности жабаскрипта).
Рисовать это дело не пробовал? То есть визуализировать.
-
Вообще, по сути твои утечки памяти, как я понимаю, это логические утечки (осталась ссылка на мусор в неком долгоживущем объекте (например в гуе)). Соответственно не понятно что ты хочешь увидеть в гипотетической тулзе которая эти утечки ловит.
Из вариантов - завести можно например флажог в объектах и при явном "удалении" объекта (dispose) выставлять этот флажок, что мол все. Нинужен. Затем можно например вывести список всех объектов с выставленным флажком и смотреть какой гад на них ссылается.
-
Рисовать это дело не пробовал? То есть визуализировать.
Пробовал с помощью http://www.graphviz.org/. Слишком много объектов. Даже на тесте - после нескольких минут генерирования картинки - картинка бесполезна. Надо существенно прорежать, но как - тоже непонятно.
-
Рисовать это дело не пробовал? То есть визуализировать.
Пробовал с помощью http://www.graphviz.org/. Слишком много объектов. Даже на тесте - после нескольких минут генерирования картинки - картинка бесполезна. Надо существенно прорежать, но как - тоже непонятно.
Ну, собственно методика прореживания описана мною выше :-)
-
Вообще, по сути твои утечки памяти, как я понимаю, это логические утечки (осталась ссылка на мусор в неком долгоживущем объекте (например в гуе)).
Нет, ссылки "извне" пока неактуальны - течет не из-за них, а за счет того, что оно зарутано в глобальном жабаскриптовом объекте.
Соответственно не понятно что ты хочешь увидеть в гипотетической тулзе которая эти утечки ловит.
Собственно я попытался описать - найти цепочку/путь от утекшего объекта объекта (я его знаю) до рута, который ее держит. В общем случае таких рутов может быть больше одного.
Из вариантов - завести можно например флажог в объектах и при явном "удалении" объекта (dispose) выставлять этот флажок, что мол все. Нинужен. Затем можно например вывести список всех объектов с выставленным флажком и смотреть какой гад на них ссылается.
Флажок не сильно поможет. Потому что ссылок на объект может быть очень много (со стороны его же потрохов). При этом реально держит его какая-то одна внешняя по отношению к этому объекту.
-
А как запускается Javascript? Если под браузером, то под каким?
-
А как запускается Javascript? Если под браузером, то под каким?
Сколь я помню, у Влада используется движок Gecko. Но не в браузере.
-
А как запускается Javascript? Если под браузером, то под каким?
Сколь я помню, у Влада используется движок Gecko. Но не в браузере.
Да, это встроенный мозилловский движок.
-
Тебе хочется один раз (сейчас) найти где течёт или хочется встроить в программу профайлер объектов чтобы никогда больше не приходилось искать ибо сама программа это будет диагностировать?
Я на работе встроил в программу (C#) профайлер объектов. Раз в минуту обхожу все объекты (отнаследованные от соответствующего класса) вывожу в файл статистику. Правда граф связей пока не строю, хватает знать какого типа объекты текут. Но можно прикрутить и построение графа, чтобы программа сама же и показывала не только что течёт, но и через какую дырку.
-
Тебе хочется один раз (сейчас) найти где течёт или хочется встроить в программу профайлер объектов чтобы никогда больше не приходилось искать ибо сама программа это будет диагностировать?
Я на работе встроил в программу (C#) профайлер объектов. Раз в минуту обхожу все объекты (отнаследованные от соответствующего класса) вывожу в файл статистику. Правда граф связей пока не строю, хватает знать какого типа объекты текут. Но можно прикрутить и построение графа, чтобы программа сама же и показывала не только что течёт, но и через какую дырку.
Меня устроил бы и такой вариант. Но я сомневаюсь в наличии универсального решения. Сама программа сильно разная (жабаскрипт же ш - кастомизация под конкретный случай, от меня не зависит, меня привлекают, когда оно падает с out of memory). Кроме того, понятие "наследования" в жабаскрипте весьма условно (да, я знаю, такой говенный язык).