Автор Тема: Утечки памяти  (Прочитано 8389 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Утечки памяти
« : Март 14, 2012, 01:15:11 pm »
Что можно почитать про ловлю утечек памяти (в условиях GC)? Какие подходы существуют и все такое. А то как-то неэффективно у меня это получается...

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Утечки памяти
« Ответ #1 : Март 14, 2012, 01:40:33 pm »
JScript?

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Утечки памяти
« Ответ #2 : Март 14, 2012, 02:36:42 pm »

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re : Утечки памяти
« Ответ #3 : Март 14, 2012, 03:13:11 pm »
На самом деле думаю что у Влада JavaScript (js) а не JScript. :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Re : Утечки памяти
« Ответ #4 : Март 14, 2012, 03:39:06 pm »
На самом деле думаю что у Влада JavaScript (js) а не JScript. :-)

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

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

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Re : Утечки памяти
« Ответ #5 : Март 14, 2012, 03:43:44 pm »
На самом деле думаю что у Влада JavaScript (js) а не JScript. :-)

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

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

Рисовать это дело не пробовал? То есть визуализировать.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re : Утечки памяти
« Ответ #6 : Март 14, 2012, 03:50:24 pm »
Вообще, по сути твои утечки памяти, как я понимаю, это логические утечки (осталась ссылка на мусор в неком долгоживущем объекте (например в гуе)). Соответственно не понятно что ты хочешь увидеть в гипотетической тулзе которая эти утечки ловит.

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Re : Утечки памяти
« Ответ #7 : Март 14, 2012, 03:52:03 pm »
Рисовать это дело не пробовал? То есть визуализировать.

Пробовал с помощью http://www.graphviz.org/. Слишком много объектов. Даже на тесте - после нескольких минут генерирования картинки - картинка бесполезна. Надо существенно прорежать, но как - тоже непонятно.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Утечки памяти
« Ответ #8 : Март 14, 2012, 03:55:15 pm »
Рисовать это дело не пробовал? То есть визуализировать.

Пробовал с помощью http://www.graphviz.org/. Слишком много объектов. Даже на тесте - после нескольких минут генерирования картинки - картинка бесполезна. Надо существенно прорежать, но как - тоже непонятно.
Ну, собственно методика прореживания описана мною выше :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Re : Утечки памяти
« Ответ #9 : Март 14, 2012, 04:01:47 pm »
Вообще, по сути твои утечки памяти, как я понимаю, это логические утечки (осталась ссылка на мусор в неком долгоживущем объекте (например в гуе)).

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

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

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


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

Флажок не сильно поможет. Потому что ссылок на объект может быть очень много (со стороны его же потрохов). При этом реально держит его какая-то одна внешняя по отношению к этому объекту.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Утечки памяти
« Ответ #10 : Март 14, 2012, 04:51:40 pm »
А как запускается Javascript? Если под браузером, то под каким?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Утечки памяти
« Ответ #11 : Март 14, 2012, 04:53:37 pm »
А как запускается Javascript? Если под браузером, то под каким?
Сколь я помню, у Влада используется движок Gecko. Но не в браузере.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Утечки памяти
« Ответ #12 : Март 14, 2012, 05:17:58 pm »
А как запускается Javascript? Если под браузером, то под каким?
Сколь я помню, у Влада используется движок Gecko. Но не в браузере.

Да, это встроенный мозилловский движок.

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Утечки памяти
« Ответ #13 : Март 15, 2012, 06:26:37 am »
Тебе хочется один раз (сейчас) найти где течёт или хочется встроить в программу профайлер объектов чтобы никогда больше не приходилось искать ибо сама программа это будет диагностировать?

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Утечки памяти
« Ответ #14 : Март 15, 2012, 11:25:47 am »
Тебе хочется один раз (сейчас) найти где течёт или хочется встроить в программу профайлер объектов чтобы никогда больше не приходилось искать ибо сама программа это будет диагностировать?

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

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