Какие методы существуют, чтобы предотвратить запуск Javascript gc как можно меньше?

Я изучаю Javascript, и в различных текстах авторы будут говорить о javascript, используя знак и развертку gc, чтобы освободить объекты из памяти. Они также будут говорить о том, как если вы установите значение, которое переменная ссылается на нуль, оно удалит ссылку на это значение, позволяя задать выделенное пространство для gc. В этом ответе SO сказано, что вы можете удалить выделенную память и ссылку, установив значение, которое переменная содержит значение null, а затем не определено, эффективно удаляя выделенное пространство из кучи (если я правильно ее понял).

Поэтому мой вопрос заключается в следующем: возможно ли писать javascript таким образом, чтобы вы могли исключить gc?

(Если это конкретная реализация, я хотел бы знать, возможно ли это на v8, хотя, если это возможно на носороге или других реализациях js, которые также будут иметь огромное значение)

Судя по таким проектам, как LLJS, мой запрос не слишком необоснован, но я не совсем уверен, как это делает модуль памяти.

Мне всегда было полезно, если я объясню, почему я спрашиваю, вот так. Мне очень нравятся компиляторы, и я хотел написать язык компиляции для js, который использовал статическую систему вывода, подобную SML. Причина, по которой я хотел написать свою собственную, состояла в том, что я хотел использовать вывод области, чтобы точно определить, когда объекты и переменные выходят за рамки (насколько это возможно), и, покинув область, удаляют ее из кучи, тем самым устраняя столько же gc, сколько возможное. Это в основном исследовательский проект (читайте: потому что я могу), поэтому любые ресурсы по оптимизации памяти в javascript также были бы очень признательны!

EDIT: Я предполагаю, что другой способ выразить это: "Можно ли написать js таким образом, чтобы gc детерминистически никогда не запускался (насколько это возможно)? Если это так, то какие методы будут задействованы?"

Я не ищу для delete потому что это отмечает элемент для удаления, тем самым ссылаясь на то, что я хотел (попытаться) избежать, мне было любопытно, будет ли выполняться реализация gc, если я удалю все ссылки (и значение), связанные с переменная.

Альтернативно, перефразируя из ссылки SO Ответ:

x = foo; x = null; x;

Является ли х еще на куче?

2 ответа

Это не совсем понятно, что вы ищете.

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

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

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

Отвечая на дополнительные вопросы, которые вы добавили в свой ответ.

Насколько я знаю, javascript только очищает вещи, когда GC работает. До тех пор объекты помечены таким образом, что GC может видеть, что в них нет ссылок на них, но они фактически не освобождаются до тех пор, пока GC не проверит и не заметит этого. Кроме того, локальные переменные в области функций сами по себе являются типом объекта, и они не освобождаются до тех пор, пока GC не запускается, и не замечает, что ссылок на область действия нет (в JS закрытие может поддерживать ссылку на область функции даже после функция завершена).

Итак, в вашем примере кода:

x = foo; x = null; x;

x все еще жив и занимает какое-то место, потому что он все еще в сфере охвата и код все еще может достичь этого. Он будет иметь значение null которое предположительно не занимает лишнее пространство за пределами самой переменной, но пространство для самой переменной не будет освобождено до тех пор, пока контекст функции, в которой он находится, окажется свободным от сборщика мусора.

JS - это сборник мусора. Это когда вещи действительно освобождаются от кучи. На этом языке нет инструкций по освобождению вещей в любое время.


Ключевое слово delete запускает сбор мусора браузером. Имейте в виду, что он удаляет целые цепочки объектов, если вы не сбрасываете ссылки на объекты.

var o = {...};

delete o;

licensed under cc by-sa 3.0 with attribution.