Утечка памяти из рекурсивных функций JavaScript в IE, FF, GoogleChrome - PullRequest
2 голосов
/ 17 августа 2011
<html>
    <body>
        <h1 id="t">Initial</h1>
            <script>
                var cnt=0;
                setTimeout("addCounter()",100);
                addCounter=function(){
                    ++cnt;
                    if (cnt>1000000) cnt=0;
                    document.getElementById('t').firstChild.nodeValue='Counter: #'+(cnt);
                    setTimeout("addCounter()",100);
                }
            </script>
    </body>
</html>

Когда я запускаю этот пример кода в Internet Explorer / Firefox / Chrome, использование памяти увеличивается до тех пор, пока браузеру / операционной системе не хватит памяти и браузер не выйдет из строя!

Кто-нибудь может помочь мне переписать код, который не тратит память? Или я должен сообщить об этом как об ошибке для разработчика браузера?

Ответы [ 4 ]

3 голосов
/ 17 августа 2011

Кажется, это прекращает использование памяти из-под контроля:

<html>
    <body>
        <h1 id="t">Initial</h1>
            <script>
                var cnt=0;
                setTimeout(addCounter,100);
                addCounter=function(){
                    ++cnt;
                    if (cnt>1000000) cnt=0;
                    document.getElementById('t').firstChild.nodeValue='Counter: #'+(cnt);
                    setTimeout(addCounter,100);
                }
            </script>
    </body>
</html>

Не используйте setTimeout со строкой.Это плохая практика по многим причинам, и очевидно увеличивает использование памяти ( Отказ от ответственности: я не эксперт по setTimeout).

1 голос
/ 18 августа 2011

После увеличения памяти тестовой машины, я обнаружил, что через некоторое время использование памяти больше не увеличивается!Кажется, сборщик мусора (или любая другая вещь, которая отвечает за реальную свободную неиспользуемую память) не оптимизирован для систем с малой памятью (например, какую я использовал в своих первых тестах). На самом деле Chrome, потратив около 50M, теперь в порядке, IE 9 после30M.и я еще не проверял FF!

0 голосов
/ 17 августа 2011

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

ps: этот скрипт можно использовать как код xss: D

0 голосов
/ 17 августа 2011

Удалить setTimeout("addCounter()",100); из тела функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...