Ich bemerke, dass nach der Verwendung von Firefox für ein paar Stunden bekommt es mehr als 2gb RAM-Speicher. Es passiert vor allem, wenn ich große Dateien (100mb-400mb) mit Ajax-Uploader hochladen, und passiert auch, wenn ich zu viele Bilder öffnen (zum Beispiel 16mb der gesamten Bilder auf einer Webseite).
Das Problem ist, dass auch nach dem Upload zu beenden oder nach dem Schließen der Bilder Seiten der Speicher nicht immer frei, Firefox haben noch 2gb ram Speicher. Gibt es eine Möglichkeit, von Javascript zu machen, Firefox frei den Speicher, zum Beispiel beim Upload beenden oder nach Bilder geladen oder geschlossen werden?
EDITAR Von about:memory
: 1.172,03 MB (100,0%) -- ausdrücklich
1.000,00 MB (85,32%) -- js
863,97 MB (73,72%) -- compartment([System Principal], 0x5083000)
819,31 MB (69,91%) Zeichenfolgen-Zeichen
Wie kann ich die String-Zeichen dass ich mir ziemlich sicher bin, dass dies geschieht, wenn die Dateien in den Speicher eingelesen und dann mit Ajax hochgeladen werden?
EDIT 2
Hier ist die auffällige Funktion, die diesen Speicherverbrauch verursacht:
function uploadAjax(file, startByte, index)
{
if(startByte==0)
{
$('#progress'+index).html(' ').progressbar( "destroy" ).progressbar();
$('#asyncuploadsingle'+index).attr('disabled', true);
}
var size = file.size;
var chunkSize = 2097152;//2 megabyte
var endByte = chunkSize + startByte;
var isLast = (size - endByte <= 0);
var chunk = file;
var xhr = new XMLHttpRequest();//prepare xhr for upload
var chunkNum = endByte / chunkSize;
if(chunkSize == 0)//no divide
{
chunk = file;
isLast = true;
}
else if(file.mozSlice) // moz slice
{
chunk = file.mozSlice(startByte, endByte);
}
else if(file.webkitSlice) //webkit slice
{
chunk = file.webkitSlice(startByte, endByte);
}
else if(file.slice) // w3c slice
{
chunk = file.slice(startByte, chunkSize);
}
else
{
chunk = file;
isLast = true;
}
//progress function, with ajax upload progress can be monitored
xhr.upload.addEventListener('progress', function(e)
{
if (e.lengthComputable)
{
var perc = Math.round((e.loaded + chunkNum * chunkSize - chunkSize) * 100 / size);
//console.log(perc+':'+index);
$('#progress'+index).progressbar("option", "value", perc);
}
}, false);
xhr.upload.onabort=function(e) {
finishUp(index,'Aborted');
};
xhr.upload.addEventListener('error', function(e){
finishUp(index, this.responseText+'--->'+name);
}, false);
xhr.onreadystatechange=function()
{
if(this.readyState == 4 && this.status == 200)
{
try
{
var ret = JSON.parse(this.responseText);
if(isLast)
{
finishUp(index,'');
}
else if(ret.status == 'error')
{
throw ret.info;
}
else
{
uploadAjax(file, endByte, index);
}
}
catch(err)
{
finishUp(index, err);
}
delete chunk;
}
};
var path = get_final_path();
var url = "filetransfer/uploadfiles.php?ax-file-name="+encodeURIComponent(file.name)+"&ax-file-path="+encodeURIComponent(path)+'&ax-start-byte='+startByte;
xhr.open("POST", url, true);
xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');//header
xhr.setRequestHeader('Content-Type', 'application/octet-stream');//generic stream header
/*var reader = new FileReader();
reader.onload = function(evt) {
xhr.sendAsBinary(evt.target.result);
};
reader.readAsBinaryString(chunk);
*/
xhr.send(chunk);
return xhr;
}
Gibt es einen Punkt, an dem man es optimieren kann oder an dem Objekte frei werden?