jQuery 泄漏问题已解决,但为什么呢?

2024-01-19

我正在开发一个包含大量 JavaScript 的大型企业应用程序。够了,我不可能遍历并修复过去 5 年开发中创建的所有小循环引用。在研究解决方案时,我遇到了这个小的 jQuery 黑客/补丁:

http://kossovsky.net/index.php/2009/07/ie-memory-leak-jquery-garbage-collector/ http://kossovsky.net/index.php/2009/07/ie-memory-leak-jquery-garbage-collector/

并决定尝试一下。令人惊讶的是,它有效! sIEVE 在我之前发现的地方没有显示泄漏,iexplore 任务正在维护更易于管理的内存占用。

我的问题是,为什么这有效? jQuery.remove 调用 .removeChild,它应该删除该元素,但显然没有。该补丁会将目标元素附加到新的垃圾收集器 div 上,然后将其清除。为什么patch方法的remove可以完全释放内存,而jQuery的remove函数却不能?我希望了解其工作原理,以便在将其签入更大的应用程序之前可能改进解决方案。


这是.remove当前 jQuery 版本 (1.6.2) 中的方法。请注意,它调用.cleanData:

// keepData is for internal use only--do not document
    remove: function( selector, keepData ) {
        for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
            if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
                if ( !keepData && elem.nodeType === 1 ) {
                    jQuery.cleanData( elem.getElementsByTagName("*") );
                    jQuery.cleanData( [ elem ] );
                }

                if ( elem.parentNode ) {
                    elem.parentNode.removeChild( elem );
                }
            }
        }

        return this;
    },

And the .cleanData它调用的方法,其中提到了票号并据称防止了可怕的泄漏(根据其中一条评论):

cleanData: function( elems ) {
        var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
            deleteExpando = jQuery.support.deleteExpando;

        for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
            if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
                continue;
            }

            id = elem[ jQuery.expando ];

            if ( id ) {
                data = cache[ id ] && cache[ id ][ internalKey ];

                if ( data && data.events ) {
                    for ( var type in data.events ) {
                        if ( special[ type ] ) {
                            jQuery.event.remove( elem, type );

                        // This is a shortcut to avoid jQuery.event.remove's overhead
                        } else {
                            jQuery.removeEvent( elem, type, data.handle );
                        }
                    }

                    // Null the DOM reference to avoid IE6/7/8 leak (#7054)
                    if ( data.handle ) {
                        data.handle.elem = null;
                    }
                }

                if ( deleteExpando ) {
                    delete elem[ jQuery.expando ];

                } else if ( elem.removeAttribute ) {
                    elem.removeAttribute( jQuery.expando );
                }

                delete cache[ id ];
            }
        }
    }

这是评论中提到的票。显然八个月前就已经修复了:

http://bugs.jquery.com/ticket/7054#comment:10 http://bugs.jquery.com/ticket/7054#comment:10

根据 Dave Methvin 的说法,解决方案似乎是确保事件处理程序中的 DOM 元素引用被 cleanData 删除,以避免 IE6/7/8 内存泄漏。

换句话说,将事件处理程序中对 DOM 元素的引用设置为null否则一些很棒的浏览器,无需提及任何名称cough IE cough会泄漏内存。

discardElement(来自您的链接)将元素插入容器中,然后清空容器,从而无效化对该元素的任何引用。

考虑到这一点,我建议升级 jQuery。您指向的文章是 2009 年的,两年大约相当于 jQuery 开发时间的四百多个工时。

最后,这里有一些关于 Internet Explorer 中泄漏模式的有趣(而且长得可笑)的读物:

  • 了解和解决 Internet Explorer 泄漏模式 http://msdn.microsoft.com/en-us/library/bb250448%28v=vs.85%29.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jQuery 泄漏问题已解决,但为什么呢? 的相关文章

随机推荐

  • 错误:“y_true 中的类数不等于 'y_score' 中的列数”

    我有一个不平衡的多类数据集 当我尝试计算 roc auc score 时 我收到此错误 ValueError y true 中的类数不等于 y score 中的列数 这是代码 model svm SVC kernel linear prob
  • 使用 Firefox Addon SDK 列出所有驱动器

    是否有跨操作系统的方法来使用 firefox addon sdk 列出所有已安装驱动器 硬盘 USB 驱动器等 的路径 我找到了适用于 Windows 的代码 但找不到跨操作系统的解决方案 Components utils import r
  • LINQ to XML - 尝试通过元素的属性值选择元素列表

    我试图从 XML 文档中获取元素列表 其中节点具有特定的属性值 该文档的结构如下
  • 从 C# 中的函数返回类

    我可以从 C 中的函数返回类对象作为返回值 而不是返回 string 或 int 或 etc C 中的类对象是一种类型 所以你绝对可以从函数返回它 public Type Foo return typeof string public Ty
  • OpenMp 与 IOS/Android 的兼容性

    我正在尝试做什么 我正在研究C c 为所有平台构建产品的代码 我操作系统 Android Windows 移动 桌面 Mac Linux 到目前为止我做了什么 是的 有许多在线链接讨论 OpenMp 与不同处理器和操作系统的兼容性 但很难从
  • xmpp框架iOS新用户注册方法

    我已经开发了适用于 iOS 的 XMPP 聊天客户端 现在我正在研究如何从 iOS 本身进行新用户注册 任何人都可以帮助注册新用户的方法 因为它需要与服务器通信并将用户名和密码存储到服务器数据库中 请帮帮我 我已经搜索了两天了 NSMuta
  • cursor.fetchone() 返回 None 但数据库中的行存在

    我正在用 python 编写一个与 MySQL 数据库交互的程序 对于 sql 查询 我使用 MySQLdb 问题是fetchone 返回 None 但通过数据库浏览器我可以看到that行存在 这段代码 query SELECT FROM
  • 如何使用Python库生成后缀树? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要可以构建后缀树 特别是广义后缀树的Python库 你能给我推荐一些图书馆吗 谢谢 请参阅以下库
  • 在 JApplet 上运行的 JPanel

    我正在设计一个 JApplet 基本上这个小程序将允许用户绘制二次方程图 并插入 x 轴和 y 轴的范围 但要达到这一目标 还有很多工作要做 我仍处于设计界面的阶段 这是我的代码 import java awt Dimension impo
  • Spring启动-配置EntityManager

    我正在使用Google guice在我的项目中 现在我尝试将框架转换为SpringBoot完全 我配置了 Beanpersistence xml like below in Autowired Bean name transactionMa
  • Java awt.Robot:CTRL+ALT+DEL 未调出所需的屏幕

    我最近刚刚发现 awt Robot 库 我很高兴能够使用它 我以为我应该对我的朋友开个小恶作剧 让机器人按控制 Alt 删除按锁定计算机按钮 但我无法让程序调出控制 Alt 删除屏幕 这是我的代码 import java awt impor
  • 构建发布时出现颤动警告

    当我尝试构建 release 我的应用程序时 我不断收到这些红色警告 尝试扑干净 flutter clean cache 没有任何作用 所有包都是最新的 我的构建 Gradle buildscript ext kotlin version
  • 高效地将字节数组转换为十进制

    如果我有一个字节数组并且想要转换该数组的连续 16 字节块 其中包含 net 的表示形式Decimal 转化为适当的Decimalstruct 最有效的方法是什么 在我正在优化的情况下 以下代码在我的分析器中显示为最大的 CPU 消耗者 p
  • 如何在.NET Framework 3.5上使用Stream.CopyTo?

    我找到了上传代码 该代码包含Stream CopyTo method Example file Stream CopyTo requestStream NET Framework 4 0 如何将 file Stream 复制到 reques
  • 比较 list 类型的 Python 字典值,看看它们是否按顺序匹配

    prefs s1 a b c d e s2 c d e a b s3 a b c d e s4 c d e b e 我有一本字典 我想比较每个键的值 类型 列表 以查看它们是否按该顺序存在 因此 本质上我试图迭代每个键值对 并将列表类型的值
  • 在 Android 中从 Facebook 检索用户名和性别

    这就是我检索存储在共享首选项中的信息 然后比较用户名和密码是否存在的方法 如果用户登录 我可以显示另一个活动 SharedPreferences 设置 getSharedPreferences logindetails 0 String u
  • Java 中的悬空线程

    Java 中的悬空线程会发生什么 就像我创建一个应用程序并且它生成多个线程一样 其中一个线程未完成 主程序在此之前完成 这条悬空的线会发生什么 它会无限地留在线程池中还是 JVM 将在阈值时间段后杀死线程 这取决于线程是否被标记为 守护进程
  • 在 char 中分配多个字符

    为什么这个程序给出输出 y include
  • 如何对结构体数组进行排序

    如何按项目名称的字母顺序对 oo 结构数组进行排序 oo struct Item Quill Ink Pen Pencil Cost 10 2 1 我尝试使用 sort 函数但它不起作用 谢谢 首先索引您的字段 在本例中oo Items它返
  • jQuery 泄漏问题已解决,但为什么呢?

    我正在开发一个包含大量 JavaScript 的大型企业应用程序 够了 我不可能遍历并修复过去 5 年开发中创建的所有小循环引用 在研究解决方案时 我遇到了这个小的 jQuery 黑客 补丁 http kossovsky net index