Проблема памяти Chrome / сборки мусора - PullRequest
2 голосов
/ 05 февраля 2011

У меня проблемы с памятью / сборкой мусора в Chrome

Я работаю над сайтом для загрузки фотографий, который позволяет моему клиенту перетаскивать фотографии для загрузки с использованием HTML5 и файлового API, поэтому в IE это не сработает. это работает только в Chrome и FF. Я еще не тестировал в Safari, Opera.

Я не использую какие-либо JS-фреймворки, и мой пример содержит менее 80 строк кода, поэтому очень легко следовать.

Вот мой пример: http://seesquaredphoto.com/testPreview.html

Если вы перетащите несколько фотографий JPG (4-5 МБ каждая) в поле, вы увидите загрузку предварительного просмотра, а в диспетчере задач Windows вы увидите увеличение использования памяти для этого окна. Если вы нажмете кнопку «Очистить изображения», изображения будут удалены.

Если вы сделаете это в FF, через несколько секунд память вернется к тому, что было до того, как вы просмотрели изображения. Однако в chrome память не падает.

Есть идеи? Я делаю что-то не так или это ошибка Chrome?

Спасибо. Вот код, если вы не хотите просматривать исходный код по ссылке выше:

Javascript

var upload = {        
    uploadFiles : function(event) {
        var files = event.dataTransfer.files;
        event.stopPropagation();
        event.preventDefault();

        var imageType = /image.*/;
        for (var x = 0; x < files.length; x++) {
            var file = files.item(x);
             if (!file.type.match(imageType) || file.fileName.toUpperCase().indexOf(".JPG")!=file.fileName.length-4) {  
               continue;  
             }      

            var s = document.createElement("span"); 
            s.className = "imgS";   
            var img = document.createElement("img");  
            img.className = "preview";  
            img.src = "";  

            s.appendChild(img);
            document.getElementById("DDCont").appendChild(s);
            loadPreview(img,file);
        }
    }
}; 
function loadPreview(img,file){
    var reader = new FileReader();  
    reader.onload = function(e) {
        img.src = e.target.result;
    }
    reader.readAsDataURL(file)
}
function init(){
    var container = document.getElementById('DDCont');
    container.addEventListener("dragenter", function(event) {
            event.stopPropagation();
            event.preventDefault();
        }, 
        false
    );
    container.addEventListener("dragover", function(event) {
            event.stopPropagation(); 
            event.preventDefault();
        },  
        false
    );
    container.addEventListener("dragleave", function(event) {
            event.stopPropagation(); 
            event.preventDefault();
        },  
        false
    );
    container.addEventListener("drop", upload.uploadFiles, false);
}   
function clearImages(){
    cont = document.getElementById("DDCont");
    while(cont.childNodes.length>0) {
         cont.removeChild(cont.childNodes[0]); 
    }
}

HTML:

<div id="DDCont" style="width:800px; height:600px; border:3px solid #333333; overflow:auto;"></div>
<input type="button" value="Clear Images" onclick="clearImages()"/>

Ответы [ 3 ]

5 голосов
/ 19 марта 2011

Да, это большая проблема и для меня,
Кажется, что современные браузеры не освобождают ресурсы, особенно с изображениями. Я думаю, что это должно быть в центре внимания, учитывая огромное количество страниц Ajax, сохранение состояния и разрешение пользователю НЕ обновлять страницу.

К счастью, с видео HTML5 вы можете добиться этого, сначала изменив src

video.src=" ";
video.load();

Если вы сделаете это до удаления элементов видео, память будет очищена.

К сожалению, я не нашел способа сделать это с помощью изображений, если он будет найден, я бы хотел знать.

1 голос
/ 06 февраля 2011

Кажется, вы правы, я полагаю, что это происходит при любом удалении DOM, память не освобождается в Chrome.То же самое происходит с Canvas:

http://code.google.com/p/chromium/issues/detail?id=40178

Возможно, вы сможете отправить отчет об ошибке (http://crbug.com/new),, и после того, как вы это сделаете, я соберу соответствующую команду для дальнейшей сортировки.

Спасибо!

0 голосов
/ 29 мая 2016

Очевидно, что это было исправлено в последних версиях хрома (по крайней мере, утечка видеопамяти).

Исправление можно найти в chrome 49, и я считаю, что это был именно тот коммит, который его исправил: https://chromium.googlesource.com/chromium/src/+/d13710832e9d0e6302cf8388cda94a7a780d8664%5E%21/#F0

Это означает, что взлом источника больше не нужен.

...