`

jQuery实时刷新引发的内存泄漏

阅读更多

工作中需要页面数据的实时刷新,采用了jQuery的ajax实现,前后台使用JSON格式数据通信。有两个定时器,每3s刷新一次,运行一段时间后发现页面内存占用了900+M,太恐怖了。调试步骤如下:

1、ajax回传数据后不做任何操作,在success中直接return,发现内存持续增长,没有缓解,初步断定是jQuery的问题,jQuery采用了1.5.2版本,查找各方帖子,都说是XMLHttpRequest对象的问题,需要清空该对象,jQuery唯一能做的就是使用:complete: function (XHR, TS) { XHR = null; } 。推断XMLHttpRequest依然没有释放。

2、更新jQuery版本,将版本更换到比较稳定的jQuery1.2.6版本,发现内存不再疯狂增长,开始了有增有落,这是个好现象。

3、去掉步骤1中增加的return; 放开后便的js继续执行。发现了内存依然缓慢增长,虽然增幅不大,但是还在增长,页面长期停留肯定依然会出现问题。继续跟踪js代码,发现页面元素的click事件每次刷新时都重新注册了一次,怀疑是他的问题,遂关闭click时间注册,页面刷新后发现内存不再持续增长,宾果! 原来是click多次注册的问题。后来将click事件注册放到了init方法中,页面初始化函数仅执行一次,初始化页面结构,注册各种事件,刷新函数定时刷新页面数据。在多次测试后均没有重现问题。本着预防为主防止结合的方针,最后在页面中也增加了定时刷新整体页面的定时器,不过设置了一个小时的时间。大可不必担心页面整体刷新降低了用户体验。

 

4、页面上还有个日志显示的模块,也是定时刷新的,长时间运行后也会出现问题。为了显示实时日志,系统采用ajax定时取数据,然后构造<li><a></></li>界面元素,append到相应的<ui></ui>中去。经过测试发现大批量的操作节目元素也同样会导致页面占用内存的持续攀升,后来更新为初始化固定数量的界面元素,每次刷新仅仅给不同的元素赋值,不再手动的新建然后删除元素,发现内存被限制在了一个范围内,不再持续增长。

5、页面中还需要注意到的一点是适用jquery的 html()函数,该函数不是基于innerHTML实现的,大量使用同样也会导致系统性能下降,可以自己重写一下:

/**
jquery html方法导致内存增长问题优化 请调用html2方法
$("#id").html2()
**/

$(function(){ 
	window.recycler = (function() {   
	    var t = document.createElement('div');   
	    t.id  = 'recycler';   
	    return t;   
	})();  

    jQuery.fn.extend({ 
    	freeMemory: function() { 
            var jel = $(this); 
            jel.unbind(); 
            var cld = jel.children(), 
                len = cld.size(); 
            if (len) { 
                $.each(cld, $.freeMemory); 
            } 
            var rel = jel.get(0); 
            if (rel && window.recycler){ 
                window.recycler.appendChild(rel); 
                window.recycler.innerHTML = ''; 
            } 
            delete rel; rel = null; 
            delete len; len = null; 
            delete cld; cld = null; 
            delete jel; jel = null; 
        },

    	html2: function(value, raw) { 
            if ((typeof raw === 'undefined' || typeof raw === 'Undefined' || !raw) && typeof value === 'string') { 
                this.children().each(jQuery.freeMemory); 
                if (this[0] && typeof this[0].innerHTML != 'undefined' && typeof this[0].innerHTML != 'Undefined') { 
                    this[0].innerHTML = value; 
                    delete value; value = null; 
                    return this; 
                } 
            } 
	    return value === undefined ? (this[0] ? this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : null) : this.empty().append( value ); 
    	}
    }); 
});

 6、使用委托替代事件注册

页面中如果元素过多,且需要为每个元素注册相同的click事件,这个时候我们优先考虑到使用委托机制,将需要注册的click事件注册到元素的上层元素或者顶层元素,这样我们就节省了大量的click注册事件。

 

总结:页面定时刷新导致页面占用系统内存会持续攀升。

1、更换更稳定的jQuery版本,版本不是越高越好啊

2、防止出现事件重复注册情况(少量的重复注册不会影响性能,如果把注册事件放到了定时器中注册,就得小心了)。

3、不要频繁的新建、删除界面元素,可以初始化元素然后在复不同的值。

4、大量使用jquery.html()函数。

5、使用委托替代直接的元素事件注册。

 

分享到:
评论

相关推荐

    jquery 内存泄露bug

    jQuery库在处理DOM操作和事件绑定时,如果不注意,可能会引发内存泄漏。例如: 1. **事件监听器**:当添加事件监听器后,如果没有解除绑定(`off()`),即使元素从DOM中移除,它们仍然保留在内存中,因为事件处理...

    JQuery无刷新上传

    **jQuery无刷新上传技术详解** 在现代Web应用中,用户对于交互体验的需求越来越高,传统的文件上传方式往往需要页面刷新,这无疑降低了用户体验。为了解决这个问题,开发者们引入了无刷新上传技术,其中jQuery无...

    jquery无刷新父级菜单切换

    "jquery无刷新父级菜单切换"是一个常见的需求,它旨在提供一种高效、流畅的用户体验,让用户在浏览网站时无需等待页面完全刷新就能切换不同的父级菜单项。这种技术常用于构建响应式和动态的Web应用,使得菜单的展开...

    jQuery不刷新分页动态数据表格代码.rar

    jQuery不刷新分页动态数据表格代码.rar jQuery不刷新分页动态数据表格代码.rar jQuery不刷新分页动态数据表格代码.rar jQuery不刷新分页动态数据表格代码.rar jQuery不刷新分页动态数据表格代码.rar jQuery不刷新...

    jQuery 局部div刷新和全局刷新方法总结

    接下来,我们将详细介绍如何使用jQuery进行局部div刷新和全局刷新。 局部div刷新主要指的是只刷新页面中某个特定的div元素区域。这在实现动态内容更新、表单提交、无刷新页面体验等方面有着重要的应用价值。jQuery...

    jquery下拉刷新插件

    **jQuery 下拉刷新插件详解** 在Web开发中,为了提供与移动应用类似的用户体验,下拉刷新功能变得越来越常见。这种交互方式允许用户通过在页面顶部或底部向下拉动来加载新的内容,通常用于社交媒体、新闻聚合等实时...

    jquery 无刷新分页排序

    **jQuery无刷新分页排序**是一种高效的网页交互技术,它结合了Ajax和jQuery库的优势,为用户提供了流畅的浏览体验,无需每次操作都重新加载整个页面。这种技术在大数据量的展示场景中尤为常见,如在线表格、论坛、...

    Jquery无刷新分页

    jQuery是一个轻量级、高性能的JavaScript库,广泛用于简化DOM操作、事件处理和动画效果,自然也可以实现无刷新分页功能。 在传统的网页分页中,每点击一次分页按钮,浏览器就会发送一个新的HTTP请求到服务器,获取...

    jquery+ajax实现无刷新提交的功能

    ### 使用jQuery与Ajax实现网页无刷新提交功能 在现代Web开发中,为了提供更好的用户体验,很多网站都会采用Ajax技术来实现在不刷新整个页面的情况下进行数据的提交与更新。本篇文章将详细介绍如何利用jQuery库结合...

    Iframe内存泄露分析

    1. Circular References:互相引用是最常见的内存泄漏原因,例如在 Internet Explorer 的 COM 基础设施和任何 scripting engine 之间的互相引用,objects 可以泄露内存。 2. Closures:闭包是一种特殊的互相引用,...

    jQuery+ASP动态实时刷新数据库数值,在线人数

    实时刷新功能是通过定时触发jQuery的Ajax请求来实现的,比如使用`setInterval`函数定期向服务器发送请求,获取最新的在线人数。这样,即使用户没有刷新页面,也能看到在线人数的实时变化。 6. **DOM (Document ...

    jQuery异步刷新

    jQuery异步刷新 服务器交互 javascript特效

    jQuery上啦刷新 jQuery下拉刷新

    "jQuery上啦刷新 jQuery下拉刷新"是一种常见的提升用户体验的技术,主要用于动态加载网页内容。当用户滚动到页面底部或顶部时,新内容会自动加载,无需手动刷新整个页面。这种方式在社交媒体、新闻网站和实时更新的...

    jquery 下拉刷新上拉加载

    jQuery的下拉刷新和上拉加载通常依赖于第三方插件,如"jQuery Pull to Refresh"或"jQuery Infinite Scroll"。这些插件利用jQuery的核心功能来监听用户的滚动行为,并在适当的时机触发刷新或加载更多内容的请求。 ...

    JQuery实现异步刷新效果

    jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,jquery,...

    Jquery实现定时刷新页面程序

    本程序是用Jquery实现网页的定时刷新的程序,简单一眼就可以看清楚。易懂。

    jQuery移动端下拉刷新、上拉加载更多插件

    本篇文章将深入探讨jQuery移动端下拉刷新与上拉加载更多插件的工作原理和实现方法。 首先,下拉刷新是一种用户交互设计,当用户在页面顶部向下拖动时,如果达到一定距离,页面会刷新内容。这个功能在新闻、社交网络...

    jquery实现页面局部刷新

    **jQuery 实现页面局部刷新详解** 在Web开发中,页面刷新是常见的操作,但全局刷新会导致整个页面重新加载,这可能会浪费用户的时间和流量。为了提高用户体验,我们常常需要实现页面局部刷新,即只更新页面中特定...

    php+jQuery ajax实现的实时刷新显示数据功能示例

    本文主要介绍如何使用php和jQuery ajax技术实现网页数据的实时刷新显示。具体来说,就是通过JavaScript的定时器,每隔一定时间就向服务器发送请求,获取最新的数据,然后在前端页面上实时更新这些数据,以实现数据的...

    jQuery无刷新实时修改输入框中的文本并保存.rar

    jQuery无刷新实时修改输入框中的文本并保存,可以把input数据在不经过数据读取的情况下及时修改,增强用户体验,确认修改后再上传数据库。 这种功能估计大家以前都见到过的,特别是在一些用户体验比较好的CMS系统...

Global site tag (gtag.js) - Google Analytics