gpt4 book ai didi

javascript - IE8中Dojo 1.7.2引起的内存泄漏

转载 作者:行者123 更新时间:2023-11-30 06:36:16 26 4
gpt4 key购买 nike

我们使用 Dojo(使用许多不同的 View 、大量按钮、 View 之间的事件等)开发了一个丰富的 Web 应用程序。任何数据都通过 Rest 接口(interface)异步加载。

现在我们意识到,在 Internet Explorer 8 中,如果应用程序的 URL 在同一个选项卡/浏览器窗口中打开两倍或更多倍,我们的应用程序的占用空间会越来越大,占用空间会增长并很快导致内存不足。

似乎 Dojo 没有断开任何事件处理程序/DOM 节点。

我追踪到只有一个 Dojo 按钮小部件的简单 html 页面,并使用 sIEve(IE8 的内存泄漏分析器)分析了 html 页面。如果再次调用 html 页面,一些 DOM 节点不会被释放(成为孤儿)。

是否有任何设置/技巧/模式可以防止孤儿?

我认为这种行为会导致我们的 Dojo 应用程序占用大量资源,在离开应用程序 URL 时不会释放该应用程序。

这是示例 html 页面:

<html>
<head>
<title>MemLeak Test</title>
<style>
@import "../themes/claro/claro.css";
</style>
<script
type="text/javascript"
data-dojo-config="'parseOnLoad':true"
src="../js/dojo-release/dojo/dojo.js"></script>
<script type="text/javascript">
require([ "dojo/parser" ]);
require([ "dijit/form/Button" ]);
</script>
</head>
<body class="claro">
<h1>Memory Leak?</h1>
<input
type="button"
dojoType="dijit.form.Button"
label="Button"></input>
</body>

在 sIEve 中打开示例 html 文件两次后,它报告已经有 18 个孤立项:HEAD、SCRIPT、DIV、SPAN(以不同的顺序重复);全部只有 1 个 Ref 并标记为泄漏!;(抱歉,我无法发布任何屏幕截图)

感谢有关该主题的任何帮助。

最佳答案

问题是你永远不会销毁这些小部件,因此浏览器会在内存中保留对事件、dom 节点等的所有引用。您可以使用卸载事件监听器部分解决问题,并调用您创建的小部件的销毁方法。

这是一个例子:

require(['dojo/_base/unload', 'dojo/_base/array'], function(unload, array){
unload.addOnUnload(function(){
array.forEach(myWidgets, function(wgt){
wgt.destroy();
});
});
});

或者,如果您没有对小部件的引用,您可以遍历 dijit 注册表:

require(['dojo/_base/unload', 'dojo/_base/array', 'dijit/registry'], function(unload, array, dijitRegistry){
unload.addOnUnload(function(){
array.forEach(dijitRegistry.toArray(), function(wgt){
wgt.destroy();
});
});
});

关于javascript - IE8中Dojo 1.7.2引起的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14255014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com