Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 美元缓存何时被视为太大?_Javascript_Jquery_Memory Leaks_Browser Cache - Fatal编程技术网

Javascript 美元缓存何时被视为太大?

Javascript 美元缓存何时被视为太大?,javascript,jquery,memory-leaks,browser-cache,Javascript,Jquery,Memory Leaks,Browser Cache,我最近读到,某些jQuery泄漏可以通过$.cache变量进行跟踪,您应该始终检查它的大小,如果它太大,说明您做错了什么 好吧,多大太大了?有没有办法检查一个变量,看看它消耗了多少内存 我正在开发一个只需加载主页即可缓存210个对象的网站。这是不是太多了?我希望能在这里详细解释一下这个问题 $。缓存的面值大小并不能说明内存泄漏。它可能非常小并且仍然存在内存泄漏,也可能非常大并且没有任何内存泄漏 如果您知道页面上一次有10个与jQuery绑定的事件侦听器,而$.cache有更多的条目,那么您就知道

我最近读到,某些
jQuery
泄漏可以通过
$.cache
变量进行跟踪,您应该始终检查它的大小,如果它太大,说明您做错了什么

好吧,多大太大了?有没有办法检查一个变量,看看它消耗了多少内存


我正在开发一个只需加载主页即可缓存210个对象的网站。这是不是太多了?我希望能在这里详细解释一下这个问题

$。缓存
的面值大小并不能说明内存泄漏。它可能非常小并且仍然存在内存泄漏,也可能非常大并且没有任何内存泄漏

如果您知道页面上一次有10个与jQuery绑定的事件侦听器,而
$.cache
有更多的条目,那么您就知道您正在泄漏

一个巨大的内存节约是使用事件委派,而不是将事件侦听器附加到每个单独的元素

说:

原因是使用了.innerHTML,它不是jQuery的一部分,因此无法进行清理

修复方法是使用jQuery方法进行相同的操作:

$("button").click( function() {
    $("#target").html("");
    $("<div>").appendTo( $("#target")).click( $.noop );
    $("#log").text( Object.keys( $.cache ).length );
});​
$(“按钮”)。单击(函数(){
$(“#目标”).html(“”);
$(“”)。附加到($(“#目标”)。单击($.noop);
$(“#log”).text(Object.keys($.cache.length);
});​

问题不在于它有多大,而在于它是如何随时间增长的。如果缓存没有边界(即永远增加),则可能存在内存泄漏。jQuery与浏览器完全兼容。它给所有浏览器带来了正确处理元素的IE问题。如果你明智的话,你将很难使用现代内存。当然,除非您创建了足够大的内存泄漏。没有神奇的内存量,这完全取决于用户的硬件。你关心使用90年代计算机的人吗?@ChuckE:手动测试
jQuery.cache
的大小并不太实际。归根结底,如果要使用jQuery,并且不希望出现泄漏,那么必须使用jQuery来销毁元素。如果使用任何其他API,都会造成泄漏。jQuery的系统在这种情况下非常脆弱。“这真的很不幸!”乔治·雷思(George Reith)没有,但我关心的是终端设备资源的优化和最佳利用。它已经吸收了垃圾收集语言,如果没有办法在运行中释放内存,人们至少必须学会如何正确使用垃圾收集器,而不管它所指向的设备的质量如何(可以是任何设备)。这是一个很好的提示。但是如何使用$.cache变量更好地检查内存使用情况呢?我刚刚想到的一个例子是:检查缓存的元素数量,单击按钮并获得预期的视觉行为,再次检查缓存的元素数量,单击“重置”上一个操作的按钮,查看缓存的元素数量是否与本测试开始时相同。例如,这是一个很好的使用$.cache来测试内存使用情况的方法吗?@ChuckE我不担心$.cache,一种避免整个事情的方法是专门使用事件委托给静态元素,这些元素一开始就不会被删除。否则,请确保始终使用jQuery方法,而不是标准的DOM方法:vs humm,有趣。这意味着,对于测试案例,$.cache甚至无法检查内存是否泄漏?不管怎样,我的解释很糟糕。这正是使用$.cache实现某种内存泄漏检查的正确方法。谢谢。请您在回复正文中插入泄漏和无泄漏的示例,好吗?我认为它们是我试图用这个问题来描述的问题的关键。那我很乐意批准;)
$("button").click( function() {
    $("#target")[0].innerHTML = "";
    $("<div>").appendTo( $("#target")).click( $.noop );
    $("#log").text( Object.keys( $.cache ).length );
});​
$("button").click( function() {
    $("#target").html("");
    $("<div>").appendTo( $("#target")).click( $.noop );
    $("#log").text( Object.keys( $.cache ).length );
});​