b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

解决方法:Js内存泄漏和解决方案

电脑杂谈  发布时间:2020-09-02 02:15:10  来源:网络整理

js内存泄漏定义_js内存泄漏及解决方法_js内存泄漏的例子

Js内存泄漏和解决方案在IE下的JS编程中,以下编程方法将导致以下问题: 即使关闭IE也无法释放内存. 给出以下类别: 1.添加到DOM对象的属性是对象Reference. 示例: var MyObject MyObject;解决方案: 在window.onunload事件中编写: document.getElementById('myDiv'). myProp null; 2. DOM对象和JS对象相互引用. 示例: 函数Encapsulator(element)元素; element.myProp newEncapsulator(document.getElementById('myDiv'));解决方案: 在onunload事件中,编写: document.getElementById('myDiv'). myProp null; 3.使用AttachEvent给DOM对象绑定事件. 示例: 函数doClick()element.attachEvent(“ onclick”,doClick);解决方案: 编写onunload事件: element.detachEvent('onclick',doClick); 4.从外到内执行appendChild.

这时,即使调用removeChild,也无法释放它. 示例: var parentDiv document.createElement(“ div”); var childDiv document.createElement(“ div”); document.body.appendChild(parentDiv); parentDiv.appendChild(childDiv);解决方案: 从头到尾执行appendChild: var parentDiv document.createElement(“ div”); var childDiv document.createElement(“ div”); parentDiv.appendChild(childDiv); document.body.appendChild(parentDiv); 5.重复重写同一属性将导致占用大量内存(但在关闭IE后将释放内存). 示例: 此方法等效于定义5000个属性!解决方案: 实际上没有解决方法~~~编程时尽量避免这种情况~~注意: 1.以上信息来自微软官方MSDN网站,链接地址为: e_leak_patterns.asp您可以转到上面的地址请参阅中的详细说明,包括示例和图例.

js内存泄漏的例子_js内存泄漏定义_js内存泄漏及解决方法

只是我的英语不太好,而且我听不太懂. 如果我犯了错误或需要添加一些内容,请指出. 2.实际上,对于第一个项目,还包括包括element.onclick funcRef在内的措辞,因为它也是对对象的引用. 页面应在onunload时释放. 3.关于第三项,MSDN的英语描述似乎是说,即使调用detachEvent,也无法释放内存,因为在attachEvent时已经引起了内存“ LEAK”,但是在detachEvent之后情况会更好. 我不知道是不是这种情况,请告诉我您是否会英语. 4.在实际编程中,这些内存问题的实际影响不是很大,尤其是当客户使用时,客户将永远不会意识到它们. ,但这些问题始终是程序员面临的问题. 头脑里有这样的BUG总是感到不舒服吧?如果能够解决,那将会解决. 这是最好的. 实际上,在这样的顶级JS源代码站点中,我将在其源代码中看到上述用于内存释放管理的解决方案. 了解和解决IE内存泄漏. Web开发的发展. 过去,Web开发人员对内存泄漏没有太多关注. 当时,页面之间的连接通常很简单,并且不同的连接地址主要用于在同一站点中导航. 这种设计方法对浏览器释放资源很有帮助.

即使在网页操作过程中发生资源泄漏,其影响也非常有限,并且常常被忽略. 今天,人们对Web应用程序有更高的要求. 页面很可能在几个小时内都不会重定向,并且页面的内容将通过Web服务动态更新. 复杂的事件关联设计以及基于对象的JScript和DHTML技术的广泛采用已使代码的容量达到了极限. 在这种情况和变化下,弄清内存泄漏的方式已变得非常紧迫,尤其是在过去,这些问题已被传统的页面导航方法屏蔽. 好消息是,当您知道要查找的内容时,更容易确定内存泄漏方法. 我们已经知道您可能会遇到的大多数泄漏问题,并且您只需少量的额外工作即可为您带来收益. 尽管在某些页面上仍可能出现少量的小泄漏,但是主要问题仍然很容易解决. 泄漏方法在以下内容中,我们将讨论内存泄漏方法并给出每种方法的示例. 一个重要的示例是JScript中的Closure技术,另一个示例是在事件执行中使用Closures. 当您熟悉此示例时,您可以找到并纠正大多数现有的内存泄漏问题,但是其他与Closure有关的问题可能会遗漏. 现在让我们看一下这些方法: 1.循环引用(Circular References)由IE浏览器的COM组件生成的对象实例与Web脚本引擎生成的对象实例相互引用,这将导致内存泄漏.

js内存泄漏定义_js内存泄漏的例子_js内存泄漏及解决方法

这也是我们在网页中遇到的最常见和主要的泄漏方法; 2.闭包闭包可以看作是周期性应用程序的一种特殊形式,它会引起很多问题. 由于依赖于指定的关键字和语法结构,因此我们更容易发现Closures调用; 3.跨页面泄漏页面交叉泄漏实际上是相对较小的泄漏,通常发生在您的浏览过程中. ,是由于内部物体太薄所致. 下面我们将讨论DOM插入顺序的问题. 在该示例中,您将发现只需要更改少量代码,就可以避免对象精简对对象构造的影响; 4.看起来像伪泄漏这不是真正的泄漏,但是如果您不了解它,那么当可用内存资源越来越少时,您可能会非常沮丧. 为了演示此问题,我们将通过重写Script元素中的内容来导致大量内存“泄漏”. 循环引用循环引用基本上是所有泄漏的发起者. 通常,脚本引擎通过垃圾收集器(GC)处理循环引用,但是某些未知因素可能会阻止资源从其环境中释放. 对于IE,脚本不知道某些DOM对象实例的状态. 它们的基本原理如下: 图基本循环参考模型此模型引起的泄漏问题基于COM参考计数.

脚本引擎对象将维护对DOM对象的引用,并等待所有引用被删除,然后再清理和释放DOM对象指针. 在我们的示例中,在脚本引擎对象上有两个引用: 脚本引擎作用域和DOM对象的expando属性. 当脚本引擎终止时,第一个引用将被释放,并且DOM对象引用将不会被释放,因为它正在等待脚本引擎的释放. 您可能会认为,检测和修复这样的假设问题非常容易,但是实际上,这些基本示例只是冰山一角. 您可能在30个对象链的末尾有一个循环引用. 这样的问题将是一件不好的事情. 如果您仍然不知道HTML代码中的泄漏情况,则可以传递全局脚本变量和DOM对象以引发并显示它. 您可以使用直接空值方法来破坏泄漏情况. 在卸载页面文档之前分配空值将使脚本引擎知道对象之间没有引用链. 现在它将清理引用并正常释放DOM对象. 在此示例中,作为Web开发人员,您应该更多地了解对象之间的关系. 作为基本情况,循环引用可能具有更复杂的表现形式. 对于基于对象的JScript,通常的用法是通过封装JScript对象来扩展DOM图像. 在构建过程中,通常将DOM对象的引用放入JScript对象,并将对新创建的JScript对象的引用存储在DOM对象中.

js内存泄漏的例子_js内存泄漏及解决方法_js内存泄漏定义

您的应用程序模型对于两个对象之间的相互访问将非常方便. 这是一个非常简单的循环引用问题,但是您可能并不在意,因为您使用了不同的语法形式. 要打破这种用例可能会变得更加复杂,当然,您也可以使用简单的示例来促进清晰的讨论. 一种更复杂的方法是记录所有需要取消引用的对象和属性,然后在卸载Web文档时统一它们. 但是,大多数情况下,您可能会创建其他泄漏,但这并不能解决您的问题. 闭包因为闭包函数使程序员在不知不觉中创建循环引用,所以它常常对资源泄漏负有不可避免的责任. 在释放封闭函数本身之前,我们很难判断父函数的参数及其局部变量是否可以释放. 实际上,使用闭包函数是如此普遍,以至于当人们经常遇到此类问题时,我们很茫然. 在了解了闭包背后的问题以及闭包泄漏的一些特殊示例之后,我们将基于圆形引用图标找到闭包的位置,并找出这些不受欢迎的引用来自何处. 由图形关闭功能引起的循环参考. 普通的循环引用是由两个无法检测到的对象相互引用引起的,但是闭包是不同的. 闭包函数不是直接引起引用,而是从其父函数的范围引入信息. 通常,函数的局部变量和参数只能在被调用函数本身的生命周期内使用.

存在闭包函数时,这些变量和参数的引用将与闭包函数一起存在,但是由于闭包函数可以存在于其父函数的生命周期之内,“关闭”被视为临时对象. 一旦函数执行退出,您将丢失对闭包本身的引用,那么如何调用detachEvent方法清除引用?在Scott Isaacs的MSN Spaces上有一种有趣的方法可以解决此问题.

js内存泄漏及解决方法_js内存泄漏定义_js内存泄漏的例子

此方法使用一个附加引用(原始方法称为第二个闭合,但在此示例中只有一个闭合)来协助window对象执行onUnload事件,因为该附加参考和闭合引用存在于同一位置object在域中,那么我们可以使用它来释放事件引用以完成引用删除. 为简单起见,我们将闭包引用临时存储在expando属性中. 下面的示例将向您展示如何释放事件引用并清除expando属性. 在这篇知识库文章中,实际上建议除非必要,否则不要创建和使用闭包. 本文中的示例向我们展示了非关闭事件引用方法,即将关闭函数放置在页面的全局范围内. 当闭包函数成为普通函数时,它将不再继承其父函数的参数和局部变量,因此我们不必担心基于闭包的循环引用. 当没有必要避免在我们的代码中出现此类问题时,不使用闭包. 最后,脚本引擎开发小组的Eric Lippert给我们带来了一篇关于闭包用法的​​好文章,它很容易理解. 他的最终建议是仅在确实需要时才使用闭包函数. 尽管他的文章没有提到使用闭包的实际情况,但此处已经提供了大量示例,它们对您入门非常有帮助. 跨页面泄漏这种类型的泄漏问题通常是由于插入顺序引起的,主要是由于临时对象在对象创建过程中无法及时清理和释放而导致的.

通常在动态创建页面元素并将其添加到页面DOM时发生. 最简单的示例场景之一是,我们动态创建两个对象,并在子元素和父元素之间创建一个临时域(译者注: 此处的域(范围)应指代管理元素之间的层次关系的对象) . 然后,当您将由这两个父子结构元素组成的树添加到页面DOM树中时,这两个元素将继承页面DOM中的分层管理域对象,并泄漏以前创建的临时域对象. 下图说明了两种动态创建元素并将其添加到页面DOM的方法. 在第一种方法中,我们将每个子元素添加到其直接父元素,最后将创建的整个子树添加到页面DOM. 当某些相关条件合适时,由于暂时的物体问题,此方法将导致泄漏. 在第二种方法中,我们从上到下创建动态元素,并在创建它们后立即将它们添加到页面DOM结构中. 由于每个添加的元素都继承了页面DOM中的域对象,因此我们不需要创建任何临时域. 这是避免潜在的内存泄漏的好方法. 图DOM插入序列泄漏模型接下来,我们将给出一个逃避大多数泄漏检测算法的泄漏示例. 因为我们实际上没有泄漏任何可见的元素,并且由于泄漏的对象太小,所以您可能根本不会注意此问题.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-312038-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...