错误的认识:不需要关心javascript和jquery的内存管理

低层次的语言,如C,具有低级别的内存管理命令,如:malloc()和free(),需要开发者手工释放内存。然而像javascript这样的高级语言情况则不同,对象(objects, strings )等创建的时候分配内存,当他们不在使用的时候内存会被自动回收,这个自动回收的过程被称为垃圾回收。因为垃圾回收的存在,让javascript等高级 语言开发者产生了一个错误的认识,以为可以不用关心内存管理。下面就重新认识一下内存回收的机制:

一、内存生命周期
      不管什么样的编程语言,内存的生命周期基本上是一致的: 分配你需要的内存  -> 使用他进行读写操作 -> 当内存不需要的时候,释放资源 。

步骤1和步骤2对于所有语言都一样,能明显觉察到。至于步骤3,低级别语言需要开发者显式执行。而对于像javascript这样的高级语言,这部分操作是交给解析器完成的,所以你不会觉察到。

二、JavaScript 中的内存泄漏

内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。由于浏览器垃圾回收方法有bug,会产生内存泄露。

    三、Javascript中出现内存泄露的主要原因是什么?

  1)循环引用

  一个很简单的例子:一个DOM对象被一个Javascript对象引用,与此同时又引用同一个或其它的Javascript对象,这个DOM对象可能 会引发内存泄露。这个DOM对象的引用将不会在脚本停止的时候被垃圾回收器 回收。要想破坏循环引用,引用DOM元素的对象或DOM对象的引用需要被赋值为 null。

  2)Javascript闭包

  因为Javascript范围的限制,许多实现依赖Javascript闭包。

  闭包可以导致内存泄露是因为内部方法保持一个对外部方法变量的引用,所以尽管方法返回了内部方法还可以继续访问在外部方法中定义的私有变量。对Javascript程序员来说最好的做法是在页面重载前断开所有的事件处理器。

  3)DOM插入顺序

  当2个不同范围的 DOM 对象连添加到一起的时候一个临时的对象会被创建。这个DOM对象改变范围到document时,那个临时对象就没用了。也就是说, DOM 对象应该按照从当前页面存在的最上面的 DOM 元素开始往下直到剩下的 DOM 元素的顺序添加,这样它们就总是有同样的范围,不会产生临时对象。

  4)如何检测?

  内存泄露对开发者来说一般很难检测因为它们是由一些大量代码中的意外的错误引起的,但它在系统内存不足前并不影响程序的功能。这就是为什么会有人在很长时间的测试期中收集应用程序性能指标来测试性能。

  最简单的检测内存泄露的方式是用任务管理器检查内存使用情况。在Chrome浏览器的新选项卡中打开应用并查看内存使用量是不是越来越多。还有其他的调试工具提供内存监视器,比如Chrome开发者工具。这是谷歌开者这网站中的堆分析的特性的教程。

   四、jquery的缺点

   优秀的jquery的一个缺点是比较容易污染Dom结构,从而导致了内存泄露。使用remove()和empty()方法能删除dom结构上的节点,删除的节点只是游离Dom的节点,以备再次恢复取回,但不能释放所占的内存空间。我遇到的问题是使用jquery实时插入<p>内容</p>,结果随着插入的次数增长,内存也在增长。最后改用原生js,就解决了。

参考:

http://www.jb51.net/article/32612.htm

http://www.php100.com/html/webkaifa/javascript/2012/0504/10356.html

时间: 2024-10-13 00:14:59

错误的认识:不需要关心javascript和jquery的内存管理的相关文章

在electron中使用bootstrap的问题:Uncaught error: bootstrap&#39;s javascript requires jquery

在electron中使用bootstrap时,虽然在引用bootstrap之前引用了jQuery,但是依然出现错误: Uncaught error: bootstrap's javascript requires jquery 解决方法:不使用script标签加载jQuery,而是使用下面的方法加载: window.$ = window.jQuery = require('/path/to/jquery'); 在electron中使用bootstrap的问题:Uncaught error: bo

Error: Bootstrap&#39;s JavaScript requires jQuery错误

引入bootstrap时会出现的问题:boostrap下拉菜单无效,浏览器报Uncaught Error: Bootstrap's JavaScript requires jQuery错误, 解决办法:注意css,js文件引入的先后顺序,应该先引入jquery的js文件再引入bootstrap的css文件. Error: Bootstrap's JavaScript requires jQuery错误

javascript内存管理

简介 JavaScript 在变量(对象,字符串等等)创建时分配内存,然后在它们不再使用时“自动”释放.后者被称为垃圾回收.“自动”这个词容易让人混淆,或者说迷惑,并给JavaScript(和其他高级语言)开发者一个印象:他们可以不用考虑内存管理.然而这是错误的. 内存生命周期 不管什么程序语言,内存生命周期基本是一致的: 分配你所需要的内存 使用分配到的内存(读.写) 不需要时将其释放\归还 在所有语言中第一和第二部分都很清晰.最后一步在低级语言中很清晰,但是在像JavaScript 等高级语

【JavaScript】jQuery Ajax 实例 全解析

jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对jQuery.ajax()进行封装以方便我们使用的方法,当然,如果要处理复杂的逻辑,还是需要用到jQuery.ajax()的(这个后面会说到). 1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中. url (String) :

为什么原生 JavaScript 开发越来越多受欢迎?是否应该跟风用原生JavaScript代替 jQuery等库?

本文标签:  jQuery的作用 原生JavaScript优势 jQuery官网 jQuery处理DOM和跨浏览器 JavaScript新特性 互联网杂谈 随着 JavaScript 本身的完善,越来越多的人开始喜欢使用原生 JavaScript 开发代替各种库,其中不少人发出了用原生 JavaScript 代替 jQuery 的声音.这并不是什么坏事,但也不见得就是好事.如果你真的想把 jQuery从前端依赖库中移除掉,我建议你慎重考虑. 首先 jQuery 是一个第三方库.库存在的价值之一在

JavaScript 之垃圾回收和内存管理

JavaScript 具有自动垃圾收集机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存.而在 C 和 C++ 之类的语言中,开发人员的一项基本任务就是手工跟踪内存的使用情况,这是造成许多问题的一个根源. 在编写 JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理.这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间

解决【Bootstrap&#39;s JavaScript requires jQuery】的问题

楼主现在在自学boostrap,就遇到了一个初学者可能遇见的问题.报了这个错误Bootstrap's JavaScript requires jQuery 提示是第6行报错.但是,楼主却发现第6行是链接.链接的名字也没出错.后来,楼主才发现是顺序的问题. 解决方法:1,文件引入的先后顺序,应该先引入jquery再引入bootstrap,也就是把这两个文件的出现顺序换一下. 2,如果不是顺序问题的话那就是版本的问题.请引入更高级的jquery版本. 解决[Bootstrap's JavaScrip

四种常见的提示弹出框(success,warning,error,loading)原生JavaScript和jQuery分别实现

虽然说现在官方的自带插件已经有很多了,但是有时候往往不能满足我们的需求,下面我简单介绍一些 常见的四种提示弹出框(success,loading,error,warning),我分别用原生JavaScript和jQuery来介绍分享给各位博友! 一.首先介绍原生JavaScript来实现四种提示弹出框: 第一步:先看看html的建立 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:

Uncaught Error: Bootstrap&#39;s JavaScript requires jQuery

boostrap下拉菜单无效,浏览器报Uncaught Error: Bootstrap's JavaScript requires jQuery错误 解决办法:注意css,js文件引入的先后顺序,首先引入jquery的js文件再引入bootstrap的css文件. Uncaught Error: Bootstrap's JavaScript requires jQuery