Javascript:内存不足

时间:2011-07-26 21:26:52

标签: javascript memory-management

我正在编写一个脚本来获取然后解析大量的XML文档。代码的相关部分如下所示。 (URL已隐藏隐私。代码中的星号实际上并不存在,它们在问题的后面用于参考)

var xmlhttp = new XMLHttpRequest();
var xmlDoc;
var chunk = parseInt(1, 10);
var subChunk = parseInt(0, 10);
var indvCount = parseInt(0, 10);
var total = parseInt(0, 10);
var max = parseInt(5000, 10);
var end = parseInt(chunk, 10) * parseInt(20, 10);
var start = parseInt(end, 10) - parseInt(19, 10);

function loadXML() {

xmlhttp.abort();
*xmlhttp.open("GET", "URL-GOES-HERE?start=" + start + "&end=" + end, false);
xmlhttp.setRequestHeader('Content-Type', 'text/xml', 'Pragma', 'no-cache');
xmlhttp.send("");
while (xmlhttp.readyState != 4) { }
xmlDoc = xmlhttp.responseXML;
readXML();

}


function readXML() {

while (subChunk < 20) {
    *indvCount = xmlDoc.getElementsByTagName("Value")[subChunk].childNodes[0].nodeValue;
    total = parseInt(total, 10) + parseInt(indvCount, 10);
    subChunk = parseInt(subChunk, 10) + parseInt(1, 10);
}
chunk = parseInt(chunk, 10) + parseInt(1, 10);
subChunk = parseInt(0, 10)
end = parseInt(chunk, 10) * parseInt(20, 10);
start = parseInt(end, 10) - parseInt(19, 10);
if (chunk > max) {
    alert(total);
} else {
    loadXML();
}

}

chunk等于约。 5,000或更多,我收到Out of Memory错误。该错误通常指的是星号之一的代码行之一。使用Windows Task Manger,我可以确认Internet Explorer的内存使用率大约为6,000K,因此我认为我没有内存泄漏。

有谁知道防止这种情况的方法?

1 个答案:

答案 0 :(得分:1)

这是你的readXML重写,以消除无用的残酷。代码后面的批评/问题:

function readXML() {
    while (subChunk < 20) {
        indvCount = xmlDoc.getElementsByTagName("Value")[subChunk].childNodes[0].nodeValue;
        total = total + parseInt(indvCount, 10);
        subChunk++;
    }
    chunk++;
    subChunk = 0;
    end = chunk * 20;
    start = end - 19;
    if (chunk > max) {
        alert(total);
    } else {
        loadXML();
    }
}
  1. 您在哪里初始化subChunk?第一次调用readXML时,subChunk(如果这是你的所有代码)将是未定义的。
  2. total同上。在哪里定义/初始化?
  3. chunk同上。哪个定义初始化?
  4. max同上。哪个定义初始化?
  5. 请注意,我已经删除了除一个parseint之外的所有parseint。除非你在那里进行各种疯狂的int / string转换,否则严格要求的唯一地方就是将XML检索的字符串转换为total计数的数字。

  6. 确定。如何重写这样......它仍然使用全局变量(坏坏坏),但更正确,更有效:

    function readXML() {
        var values = xmlDoc.getElementsByTagName("Value");
        for (i = 0; i < values.length; i++) {
           total += parseInt(values[i].childNodes[0].nodeValue);
        }
        chunk++;
        end = chunk * 20;
        start = end - 19;
        if (...) { ... }
    }
    

    您的代码执行重复的getElementsByTagName调用(昂贵),访问一个值,然后抛弃其他所有内容。另一个gEBTN()调用,访问另一个值,抛出结果,yada yada yada。 CPU周期,内存等的主要浪费......使用上面的结构,你可以执行gEBTN() ONCE ,然后迭代结果,拉出所有相关节点。