其实不知道怎么起这篇blog的题目了 其实只要涉及的内容是内存泄漏的问题,也有内存管理的一些知识,把学习的过程拿来分享

垃圾回收机制

js具有自动的垃圾收集机制,它会找出那些不在继续使用的变量然后释放其内存,垃圾收集器会按照固定的时间间隔周期性的执行这一操作


我们通过下面的例子来理解垃圾收集器的执行过程

<div id="test">sss</div>
<script type="text/javascript">
function test() {
this.elem = document.getElementById("test"); }
var a = new test();
document.body.innerHTML = "";
console.log(a.elem);//<div id="test">sss</div>
console.log(document.getElementById("test"));//null
a = new test();
console.log(a.elem);//null
</script>

在上面的例子中,我们定义了一个构造函数,它返回的对象中有elem属性指向页面中id为test的元素,我们创建了一个变量a指向构造函数返回的对象,然后在父元素中删除这个id为test的元素,但是我们通过a.elem属相仍然能获取到这个id为test的div 但是我们通过正常的document.getElementById("test")已经无法获取到这个元素了,此时这个div元素只存在内存中,是因为这个div被这个elem引用着,所以它不会被垃圾回收器回收,仍然存在内存中.当我们重新将变量a指向另一个返回的引用值的时候,此时不存在对这个div的引用了,这段内存就会被回收,第二次输出a.elem输出为null是因为页面中不存在这个id为test的元素

闭包经常会导致环装的引用

<div id="test">sss</div>
<script type="text/javascript">
function test() {
var div = document.getElementById("test");
div.onclick = function() {
console.log(1);
}
}
test();

在上面的例子中 有这样一个函数,它的功能是为页面中id为test的元素绑定click事件,这个click事件(function)绑定后,就存在了js的运行环境(内存中),它引用了一个局部的变量div,这样当这个函数运行完后,这个局部变量div所占据的内存不会被垃圾回收器回收,会存在在内存中,这样就会导致内存的泄漏

仔细理解闭包:

  function test() {
var a = 100;
var b = 200;
function say(){ }
return say;
} var aa = test();

在上面的例子中,我们定义了一个方法,它有两个局部的变量 a b 和一个方法say并且通过return语句返回了这个方法,这就构成了一个闭包.这个时候say存在内存中,它引用的父级作用域的变量也会存在内存中,也就是a b 也同时存在内存中,(js的解释器无法优化的知道say方法到底使用了父级作用域的哪些变量和方法,所以它将父级作用域的所有变量和方法都保存在内存中,不被垃圾回收器回收),这也造成内存的泄漏

管理内存

系统分配给浏览器的内存是存在一定的限制的,我们必须更好的管理好这些内存才能更好的使我们的网页性能最大化,目标就是尽可能的保存必要的数据,将不必要的数据通过解除引用,设置其为null.这样做的目的是让这个变量脱离当前的执行环境,以便在垃圾回收器下次运行的时候对这个变量的内存进行回收

  function test() {
var a = 100;
var b = 200;
function say(){ }
var a = null;
var b = null;
return say;
} var aa = test();

上面的例子就将a b脱离的执行环境,在垃圾回收器下次运行的时候,会被回收

参考 JavaScript高级程序设计                memory leaks

2016 5 10 事件处理中的内存问题

为什么添加事件处理程序会增加内存的占用  事件处理程序就是函数,在js中函数均是对象,对象的存在就会占用内存,如何最小化的添加事件处理程序就最大限度的提高了页面的性能 所以出现了事件委托

通过事件冒泡,在父元素处理上通过event.target来进行事件的处理

移除不需要的事件处理程序也能降低内存的占用  但是这种情况有例外的情况

    <div>
<input type="button" value="test" />
</div>

在上面的例子中,我们为button添加了事件处理程序,当获取外层的div 并且通过innerHTML将这个button移除的时候,可能会存在这个btn 和 事件处理程序还存在页面的情况 也就是这篇blog刚开始的例子,所以当我们要移除元素的时候,可以将他的事件处理程序设置为null(移除事件处理程序)

2016 6 19   贴出一篇园友的blog 讲解的很细致   javascript中对内存的一些了解  在这篇文章中引用了另一篇园友的文章  var a.x = a = {n:2}的这个问题很有意思

js 内存小记的更多相关文章

  1. JS内存泄露常见原因

    详细内容请点击 分享的笔记本-前端 开发中,我们常遇见的一些关于js内存泄露的问题,有时候我们常常会找半天找不出原因,这里给大家介绍简单便捷的方法 1.闭包上下文绑定后没有释放:   2.观察者模式在 ...

  2. Chrome JS内存泄漏排查方法(Chrome Profiles)

     原文网址:http://blog.csdn.net/kaitiren/article/details/19974269 JS内存泄漏排查方法(Chrome Profiles)   Google Ch ...

  3. Js内存泄露问题总结

    最近接受了一个Js职位的面试,问了很多Js的高级特性,才发现长时间使用已知的特性进行开发而忽略了对这门语言循序渐进的理解,包括Java我想也是一样,偶尔在Sun官方看到JDK6.0列举出来的new f ...

  4. js内存深入学习(二)

    继上一篇文章 js内存深入学习(一) 3. 内存泄漏 对于持续运行的服务进程(daemon),必须及时释放不再用到的内存.否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃. 对于不再用到的内 ...

  5. js内存深入学习(一)

    一. 内存空间储存 某些情况下,调用堆栈中函数调用的数量超出了调用堆栈的实际大小,浏览器会抛出一个错误终止运行.这个就涉及到内存问题了. 1. 数据结构类型 栈: 后进先出(LIFO)的数据结构  堆 ...

  6. js内存空间的那点事

    由于js具有自动垃圾回收机制,导致接触js后一直没去关注js的内存分配及变量回收等原理,只是懵懂的了解用变量标记法(null)可以手动的去清除或是回收:是时候弥补这个大坑了... 垃圾回收两种方法 一 ...

  7. 转---单页面应用下的JS内存管理

    正文从这开始- 内存问题对于后端童鞋而言可能是家常便饭,特别是C++童鞋.我在实习时做过半年的c++游戏客户端开发(也是前端开发哦),也见识了各式各样的内存问题,就说说我的第一个坑,当时做个需求,就是 ...

  8. js内存空间详细图解-笔记

    原文参考http://mp.weixin.qq.com/s/NGqdjhoU3MR9LD0yH6tKIw 栈-先进后出堆-类比成书于书架(形象),只要知道Key就可以找到value 基础数据类型(Un ...

  9. JS内存空间详细图解

    JS内存空间详细图解 变量对象与堆内存 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 因为JavaScript具有自动垃圾回收机 ...

随机推荐

  1. CSS裁剪clip

    × 目录 [1]定义 [2]RECT [3]应用 前面的话 CSS裁剪clip这个属性平时用的不多,但其实它并不是CSS3的新属性,很早就开始出现了.本文将介绍关于clip属性的相关知识 定义 一个绝 ...

  2. java中自动装箱的问题

    package wrapper; public class WrapperDemo { public static void main(String[] args) { Integer a=new I ...

  3. 后端码农谈前端(CSS篇)第三课:选择器

    一.选择器 1.ID选择器: 语法:首先,ID 选择器前面有一个 # 号 - 也称为棋盘号或井号.请看下面的规则: *#intro {font-weight:bold;} 与类选择器一样,ID 选择器 ...

  4. 【原创】C#搭建足球赛事资料库与预测平台(6) 赔率数据表设计2

            本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 本篇文章开始将逐步介 ...

  5. c#基础之数组

    最近看了c#的数组,比c++的数组更加直接,.net也提供了很多直接直接操纵数组的方法,非常方便,所以就想做个总结. 利用数组,我们可以使用变量来声明相同类型的多个数据项的集合,数组中的每个数据使用索 ...

  6. .Net常见错误

    常见错误 #1: 把引用当做值来用,或者反过来 C++ 和其他很多语言的程序员,习惯了给变量赋值的时候,要么赋单纯的值,要么是现有对象的引用.然而,在C# 中,是值还是引用,是由写这个对象的程序员决定 ...

  7. Windows Azure Cloud Service (44) 将Cloud Service加入Virtual Network Subnet,并固定Virtual IP Address(VIP)

    <Windows Azure Platform 系列文章目录> 在之前的文章中,笔者已经详细介绍了如何将Virtual Machine加入Virtual Network,并且绑定固定的Pr ...

  8. 用Android模拟器也可以开发和测试NFC应用

    从Android2.3开始支持NFC.不过NFC应用只能在Android手机(或平板电脑)上测试和开发,而且Android手机还必须有NFC芯 片.而且如果测试NFC传输文件时至少需要两部支持NFC的 ...

  9. 拓扑排序 --- hdu 4948 : Kingdom

    Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  10. Linq查询操作之排序操作

    在Linq中排序操作可以按照一个或多个关键字对序列进行排序.其中第一个排序关键字为主要关键字,第二个排序关键字为次要关键字.Linq排序操作共包含以下5个基本的操作. 1.OrderBy操作,根据排序 ...