как ECMAScriptv5, каждый раз, когда элемент управления вводит код, enginge создает LexicalEnvironment (LE) и VariableEnvironment (VE) для кода функции, эти 2 объекта являются точно такой же ссылкой, что является результатом вызова NewDeclarativeEnvironment (ECMAScript v5 10.4.3), и все объявленные переменные в функциональном коде хранятся в файле среды компонента VariableEnvironment (ECMAScript v5 10.5), и это базовое понятие для закрытия.
Что меня смутило, так как Garbage Collect работает с этим методом закрытия, предположим, что у меня есть код вроде:
function f1() {
var o = LargeObject.fromSize('10MB');
return function() {
// here never uses o
return 'Hello world';
}
}
var f2 = f1();
после строки var f2 = f1()
наш графический объект будет:
global -> f2 -> f2 VariableEnvironment -> f1 VariableEnvironment -> o
так как из моего небольшого знания, если механизм javascript использует метод подсчета ссылок для сбора мусора, объект o
имеет в аренду 1 refenrence и никогда не будет быть GCed. По-видимому, это приведет к пустой трате памяти, поскольку o
никогда не будет использоваться, но всегда будет храниться в памяти.
Кто-то может сказать, что движок знает, что f2 VariableEnvironment не использует f1 VariableEnvironment, поэтому вся f1 VariableEnvironment будет GCed, поэтому есть еще один фрагмент кода, который может привести к более сложной ситуации:
function f1() {
var o1 = LargeObject.fromSize('10MB');
var o2 = LargeObject.fromSize('10MB');
return function() {
alert(o1);
}
}
var f2 = f1();
в этом случае f2
использует объект o1
, который хранится в f1 VariableEnvironment, поэтому f2 VariableEnvironment должен содержать ссылку на f1 VariableEnvironment, что приводит к тому, что o2
также не может быть GCed, что приводит к пустой трате памяти.
поэтому я хотел бы спросить, как современный javascript engine (JScript.dll/V8/SpiderMonkey...) обрабатывает такую ситуацию, есть ли стандартное заданное правило или оно основано на реализации, и каков точный механизм JavaScript javascript графа объектов при выполнении коллекции мусора.
Спасибо.