Javascript 从WEB提取JSON时内存泄漏

Javascript 从WEB提取JSON时内存泄漏,javascript,jquery,memory-leaks,json,Javascript,Jquery,Memory Leaks,Json,我花了好几天的时间在这个问题上,从我能想到的每个角度都做到了。我正在开发一个简单的Windows7小工具。此脚本将从远程web服务器提取JSON数据并将其放在页面上。我使用jQuery1.6.2作为$.getJSON。脚本在每个循环中消耗更多内存 var计数=1; $(文档).ready(函数(){ updateView(); }); 函数updateView(){ $(“#垃圾”).html(计数); 计数++; $.getJSON(URL+“&回调=?”,populateView); set

我花了好几天的时间在这个问题上,从我能想到的每个角度都做到了。我正在开发一个简单的Windows7小工具。此脚本将从远程web服务器提取JSON数据并将其放在页面上。我使用jQuery1.6.2作为$.getJSON。脚本在每个循环中消耗更多内存

var计数=1;
$(文档).ready(函数(){
updateView();
});
函数updateView(){
$(“#垃圾”).html(计数);
计数++;
$.getJSON(URL+“&回调=?”,populateView);
setTimeout(updateView,1000);
}
函数populateView(状态){
$(“#调试”).html(status.queue.mbleft+“剩余MB
”+status.queue.MB+“总计MB”); }
任何帮助都将不胜感激……谢谢

编辑:添加JSON数据样本

?({"queue":{"active_lang":"en","paused":true,"session":"39ad74939e89e6408f98998adfbae1e2","restart_req":false,"power_options":true,"slots":[{"status":"Queued","index":0,"eta":"unknown","missing":0,"avg_age":"2d","script":"None","msgid":"","verbosity":"","mb":"8949.88","sizeleft":"976 MB","filename":"TestFile#1","priority":"Normal","cat":"*","mbleft":"975.75","timeleft":"0:00:00","percentage":"89","nzo_id":"-n3c6z","unpackopts":"3","size":"8.7 GB"}],"speed":"0  ","helpuri":"","size":"8.7 GB","uptime":"2d","refresh_rate":"","limit":0,"isverbose":false,"start":0,"version":"0.6.5","new_rel_url":"","diskspacetotal2":"931.51","color_scheme":"gold","diskspacetotal1":"931.51","nt":true,"status":"Paused","last_warning":"","have_warnings":"0","cache_art":"0","sizeleft":"976 MB","finishaction":null,"paused_all":false,"cache_size":"0 B","finish":0,"new_release":"","pause_int":"0","mbleft":"975.75","diskspace1":"668.52","scripts":[],"categories":["*"],"darwin":false,"timeleft":"0:00:00","mb":"8949.88","noofslots":1,"nbDetails":false,"eta":"unknown","quota":"","loadavg":"","cache_max":"0","kbpersec":"0.00","speedlimit":"","webdir":"","queue_details":"0","diskspace2":"668.52"}})
编辑2:将代码精简到这一步,它仍然会泄漏。我认为这消除了作为贡献者遍历DOM

$(文档).ready(函数(){
setInterval(updateView,1000);
});
函数updateView(){
$.getJSON(URL+“&回调=?”,populateView);
}
函数populateView(状态){
}
编辑3:它不是jQuery。我删除了jQuery并使用straight js完成了它。仍在泄漏

函数init(){
setInterval(updateView,1000);
}
函数updateView(){
var xhr=new XMLHttpRequest();
xhr.open(“GET”,URL,false);
xhr.setRequestHeader(“如果自”0“起修改);
xhr.send(“”);
}
所以…如果不是jQuery,也不仅仅是IE(Chrome也是)。搞什么鬼?!想法

谢谢大家!

编辑2:

如果实际上是taskmanager在这里显示了漏洞,那么我认为下一步是调查IE,因为我相信IE是用来托管Windows小部件的引擎

如果您可以在一个小html文件中重新创建脚本,您可以运行此工具,并查看是否是IE在执行此操作:

还有,你是在运行IE8还是IE9


编辑:

基于Op中的JSON字符串;基本上,这个问题在这里是误导性的。 发布的javascript代码运行得非常好

产生JSON的服务器在内存使用方面表现出差异,我会调查创建JSON的网站/端点,看看问题出在哪里


只是有个想法

$.getJSON只是jQuery的$.ajax调用的一个速记函数

我想知道如果您将代码更改为使用$.ajax,但特别添加了缓存机制,是否会产生不同的效果:

$.ajax({
  url: URL + "&callback=?",
  dataType: 'json',
  cache: false,
  success: populateView
});

这可能会阻止它尝试将其存储在内存中,并且根据您的浏览器,它可能会显示更多内存,因为您只是没有收集垃圾,可以这么说。

我感觉updateView中的setTimeout函数导致了这种行为。要测试这一点,您可以将代码修改为:

$(document).ready(function () {
   setInterval(updateView, 1000);
});

function updateView(){
    $("#junk").html(count);
    count++;
    $.getJSON( URL + "&callback=?", populateView);
}

function populateView(status) {
    $("#debug").html(status.queue.mbleft + " MB Remaining<br>" + status.queue.mb + " MB Total");
}
编辑3:我更改了上面的代码,因为我忘记接收服务器的响应。假设
queue
是返回的JSON的属性,那么代码应该如上所述

编辑4:这是一个非常有趣的问题。那么另一种方法。让我们假设仍然有一些客户端脚本正在阻塞内存。这会是什么?据我所知,剩下的两件事是setInterval和$.getJSON函数。$.getJSON函数是一个简单的ajax请求包装器,它触发请求并等待服务器的响应。setInterval函数有点特殊,因为它将设置计时器、消防功能等


我认为,如果你能在服务器上模仿这一点,甚至每秒钟/5秒在浏览器中刷新一次此网页,你就能看到是客户端还是服务器处理你的请求。

发现此线程试图找到此问题的根本原因,因为我最近也遇到了类似问题虽然我的记忆每分钟会增加1Mb左右。。。我几乎将它与json解析隔离开来。运行ajax命令并键入:“text”,您应该会看到内存已被清理


我发现了一个使用JS引擎(而不是eval)递归解析json数据的库。我在成功回调中手动将文本数据解析为json,效果很好

你能在jsfiddle.net上组装一把小提琴吗?这将给你一个我们可以看到的示例。另外,我们在这里讨论的内存是多少?页面上还有什么其他情况?“状态”变量是什么?请澄清,它是否真的泄漏,或者如果您让它运行一段时间,它是否已清除?您能否尝试在本文中接受的答案,看看您是否仍然遇到问题?没有帮助…仍然每秒泄漏5-10K。不…客户端显示内存泄漏。每次JSON轮询服务器时,js内存消耗都会增加。客户端正在显示它,但它不是在根据queue.mbleft和queue.mb的值进行计算吗?请忽略JSON内容……这与此无关。这与我在客户层面看到的情况无关。我坐在这里观看客户端的任务管理器,每次它轮询服务器时,内存使用量都会增加。我更改了上面注释中所述的代码,因此脚本所做的唯一事情就是$.getJSON…其他什么都没有。。。内存仍然泄漏。是的,对不起-我想我们被你的调试消息谈论内存使用的事实分散了注意力;有点假设这就是你的数据来源。没有帮助…仍然泄漏大约300K/分钟。@T3chDad,如果你将间隔增加到5秒会怎么样。原因是,如果jquery每秒遍历DOM都会消耗内存,那么它就会显示出来。我将添加另一个编辑,以便也看到它。这个status.queue数据是由您的特定JSON对象返回的吗?如果是这样,那么你测量的是错误的东西,返回的内存是t上的内存
        $(document).ready(function () {
            var debug = $('#debug'); 
            var junk = $('#junk')          ;
            setInterval(function(){updateView(debug, junk)}, 1000);

        });

        function updateView(debug, junk){
           junk.html(count);
            count++;
            $.getJSON( URL + "&callback=?", function(status){populateView(status,debug)});
        }

        function populateView(status) {
            debug.html(status.queue.mbleft + " MB Remaining<br>" + status.queue.mb + " MB Total");
        }