О замыкании, LexicalEnvironment и GC

как ECMAScriptv5, каждый раз, когда элемент управления вводит код, механизм создает 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's VariableEnvironment -> f1's VariableEnvironment -> o

так что, насколько мне известно, если механизм javascript использует метод подсчета ссылок для сборки мусора, объект o имеет в аренде 1 ссылку и никогда не будет GCed. По-видимому, это приведет к пустой трате памяти, поскольку o никогда не будет использоваться, но всегда хранится в памяти.

Кто-то может сказать, что движок знает, что f2's VariableEnvironment не использует f1's VariableEnvironment , поэтому все f1's VariableEnvironment будет GCed, поэтому есть еще один фрагмент кода, который может привести к более сложной ситуации:

function f1() {
    var o1 = LargeObject.fromSize('10MB');
    var o2 = LargeObject.fromSize('10MB');
    return function() {
        alert(o1);
    }
}
var f2 = f1();

в этом случае f2 использует объект o1 , который хранится в f1's VariableEnvironment , поэтому VariableEnvironment f2 должна содержать ссылку на f1's VariableEnvironment , в результате чего o2 также не может быть GCed, что еще больше приводит к нерациональной трате памяти.

поэтому я хотел бы спросить, как современный движок javascript (JScript.dll / V8 / SpiderMonkey ...) справляется с такой ситуацией, существует ли стандартное указанное правило или оно основано на реализации, и каков точный шаг движка javascript обрабатывает такие граф объекта при выполнении сборки мусора.

Спасибо.

13
задан otakustay 29 December 2011 в 09:02
поделиться