Правила закрытия сборки мусора с помощью Javascript - PullRequest
7 голосов
/ 27 марта 2011

У меня есть программа, которая использует Javascript в качестве языка сценариев, привязанного к более крупному приложению C ++.Я использую V8 и webkit взаимозаменяемо, но основное время выполнения не должно иметь значения для этого вопроса.

В этом приложении у меня динамически созданные объекты будут получать обратные вызовы.Я создам эту привязку обратного вызова следующим образом ...

function f() {
  var obj = CreateNewCallbackObj();
  obj.onCallback = dowork; // dowork is a function
}

Очевидно, что это будет иметь проблемы с сборкой мусора, потому что obj вышел из области видимости и в конечном итоге будет удален.

Я хочу, чтобы объект сам управлял своим временем жизни.Объект в конечном итоге получит обратный вызов, который будет сигнализировать об окончании его жизни, и когда это произойдет, он может удалить себя.

Одна мысль состоит в самоотсылке путем добавления obj.myself = obj.Это кажется неправильным способом сделать это, но он может работать, если алгоритм сбора мусора не умный.

Есть ли правильный способ сделать это?Не существует базового постоянного DOM, который создан для хранения объектов, все объекты JS распределяются динамически по мере необходимости, но требуется какой-то способ остаться внутри механизма JS.

1 Ответ

7 голосов
/ 27 марта 2011

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

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

Вы также можете добавить свойство alive, проверить это в начале всех методов и вызватьошибка, если метод вызывается при !this.alive - это, конечно, не гарантия, но может помочь при отладке.

...