Firefox console.log, запрещающий сборке мусора JavaScript String? - PullRequest
1 голос
/ 04 января 2012

При использовании следующего кода при включении console.log строка, на которую ссылается o.big, не будет собирать мусор.Как только я удаляю оператор регистрации, память для большой строки освобождается после завершения выполнения функции-обработчика.

Я использую Firefox 9.0.1, и профилирование памяти было выполнено с помощью about: memory.

$(function() {  
    var handler = function() {  
      var o = {};  
      o.big = (new Array(20*1024*1024)).join("x");  
      console.log(o.big);  
      delete o.big;  
    };  

    $("#btn").click(handler);
});

Я довольно новичок в JavaScript, и было бы замечательно, если бы кто-то мог указать мне, почему строка не помечается gc, если используется в console.log.

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Хотя я не слишком знаком с обработкой Firefox / Firebug console.log(), я предполагаю, что консоль, показывающая «зарегистрированный» объект, предоставляет способ изучения и взаимодействия с ним. Это как минимум так для Chrome.

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

Наконец, имейте в виду, что между оператором delete и сборкой мусора нет явной связи.

0 голосов
/ 04 января 2012

Не уверен, что Firefox хранит ссылку на исходную строку там. Я бы сказал, что console.log() сохраняет копию , поскольку строки являются первоклассными членами в JS.

Вы можете увидеть, как использование памяти string-chars падает в about:memory, но heap-unclassified растет. Это может быть связано с https://bugzilla.mozilla.org/show_bug.cgi?id=563700, или это может означать, что GF FF не работает.

...