多个XMLHttpRequest.send或eventlisteners内存泄漏?

时间:2016-03-30 13:20:47

标签: javascript object events memory memory-leaks

我目前正在实施文件上传。因为我在这里和那里处理大文件我已经开始切片文件并以1mb块的形式发送它们只要文件是lapply就可以了,之后看起来内存不是&#39}任意随意释放任何人,我无法弄清楚我在这里失踪了什么。

准备块

<~500MB

发送大块

var sliceCount = 0;
var sendCount = 0;
var fileID = generateUUID();
var maxChunks = 0;
var userNotified = false;

function parseFile(file)
{
    var fileSize = file.size;
    var chunkSize = 1024 * 1024;//64 * 1024; // bytes
    var offset = 0;
    var self = this; // we need a reference to the current object
    var chunkReaderBlock = null;
    var numberOfChunks = fileSize / chunkSize;
    maxChunks = Math.ceil(numberOfChunks);

    // gets called if chunk is read into memory
    var readEventHandler = function (evt)
    {
        if (evt.target.error == null) {
            offset += evt.target.result.byteLength;

            sendChunkAsBinary(evt.target.result);
        }
        else
        {
            console.log("Read error: " + evt.target.error);
            return;
        }

        if (offset >= fileSize) {
            console.log("Done reading file");
            return;
        }

        // of to the next chunk
        chunkReaderBlock(offset, chunkSize, file);
    }

    chunkReaderBlock = function (_offset, length, _file)
    {
        var r = new FileReader();
        var blob = _file.slice(_offset, length + _offset);

        sliceCount++;
        console.log("Slicecount: " + sliceCount);

        r.onload = readEventHandler;
        r.readAsArrayBuffer(blob);

        blob = null;
        r = null;
    }
    // now let's start the read with the first block
    chunkReaderBlock(offset, chunkSize, file);
}

如果我在Visual Studio 2015中附加到调试器,则需要一点但很快我会在send函数中得到function sendChunkAsBinary(chunk) { var progressbar = $("#progressbar"), bar = progressbar.find('.uk-progress-bar'); // create XHR instance var xhr = new XMLHttpRequest(); // send the file through POST xhr.open("POST", 'upload.php', true); var progressHandler = function (e) { // get percentage of how much of the current file has been sent var position = e.loaded || e.position; var total = e.total || e.totalSize; var percentage = Math.round((sendCount / maxChunks) * 100); // set bar width to keep track of progress bar.css("width", percentage + "%").text(percentage + "%"); } // let's track upload progress var eventSource = xhr.upload || xhr; eventSource.addEventListener("progress", progressHandler); // state change observer - we need to know when and if the file was successfully uploaded xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status == 200) { eventSource.removeEventListener("progress", progressHandler); if (sendCount == maxChunks && !userNotified) { userNotified = true; notifyUserSuccess("Datei hochgeladen!"); setTimeout(function () { progressbar.addClass("uk-invisible"); bar.css("width", "0%").text("0%"); }, 250); updateDocList(); } } else { notifyUser("Fehler beim hochladen der Datei!"); } } }; var blob; if (typeof window.Blob == "function") { blob = new Blob([chunk]); } else { var bb = new (window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder)(); bb.append(chunk); blob = bb.getBlob(); } sendCount++; var formData = new FormData(); formData.append("chunkNumber", sendCount); formData.append("maxChunks", maxChunks); formData.append("fileID", fileID); formData.append("chunkpart", blob); xhr.send(formData); progressbar.removeClass("uk-invisible"); console.log("Sendcount: " + sendCount); } OutOfMemoryException。它一直是发生异常的同一行。

一旦异常发生,我得到blob = new Blob([chunk]);但是我仍然在我的php文件中得到了块。

这是我的错误的时间轴图

Timeline of error

我不明白,我无法在任务管理器中看到增加的内存(当然是几mb但是我没有接近16gb ram)。

那么有谁能告诉我这个泄漏来自哪里?我错过了什么?

0 个答案:

没有答案