废话片:

  讲到内存可以联想到很多,内存分配管理,内存回收机制,内存泄露等等,今天我们就来答题的总结一下。

正文片:

1.内存分配管理

2.内存回收机制

3.内存泄露

一、内存分配管理

  首先让我们看看内存的分配机制吧。其实在所有的语言中内存的分配都是一样的,首先在我们需要的时候记性内存的分配,然后是使用分配的内存,最后是当我们不适用的时候收回内存块。

  问题:在js中是如何分配内存的呢,什么时候分配呢?

  回答:在js中当我们定义了变量的时候实际上就为我们分配好了内存的,这样将会省去我们的很多麻烦。了如如下:

 // 给数值变量分配内存
var n = 123;
// 给字符串分配内存
var s = "azerty"; // 给对象及其包含的值分配内存
var o = {
a: 1,
b: null
}; // 给数组及其包含的值分配内存(就像对象一样)
var a = [1, null, "abra"]; // 给函数(可调用的对象)分配内存
function f(a){
return a + 2;
} // 函数表达式也能分配一个对象
someElement.addEventListener('click', function(){
someElement.style.backgroundColor = 'blue';
}, false);

     当然,还有其他的也写情况实际上也是需要系统为我们分配内存的,例如当我们使用构造函数来定义一个新的对象的时候,我们是需要对新的对象讨要空间的。

 var d = new Date(); // 分配一个 Date 对象
var e = document.createElement('div'); // 分配一个 DOM 元素

     有的时候我们需要对于数据进行组合或是在原有的数据上进行值的设置,这时系统也会为我们新分配一块内存区域。

 var s = "azerty";
var s2 = s.substr(0, 3); // s2 是一个新的字符串
// 因为字符串是不变量
// JavaScript 可能没有分配内存
// 但只是存储了 [0-3] 的范围。 var a = ["ouais ouais", "nan nan"];
var a2 = ["generation", "nan nan"];
var a3 = a.concat(a2);
// 新数组有四个元素,是 a 连接 a2 的结果

  问题:内存空间使用?

  回答:当系统为我们分配了内存空间之后我们实际上在每一次对于当前的值得操作的时候都是使用了这一内存块,读取和写入操作将会是我们对于内存块的基础操作。

二、内存回收机制

  问题:js的内存是如何回收的?

  回答:js是具有自动垃圾收集机制的,这种机制会自动的跟踪每一个变量的动向,并判断当前的变量是否还有存在的必要,然后将不必要的变量所占用的内存进行收回。对于这样的收回机制,实际真正的运用起来是有两种不同的方法来实现的。详情见如下:

  1.方法一:标记清除算法

    这一算法是为进入环境中的变量标记一个“进入环境”的标记。逻辑上讲呢,当我们的变量进入环境的时,变量实际上是不应该被删除的,因为上下文中可能会用到当前的变量进行相关的逻辑演算,而当变量离开环境的时候,竟会为其标记成为“离开环境”的状态。

  2.方法二:引用计数

      引用对象是放在堆中的,而这一内存清理方法是对这一值的引用次数进行统计,当我们声明了一个变量,并且将引用对象的值赋值给了这一变量,则引用对象的引用计数加   一,反之当我们的引用对象的相关引用变量其指向的内容发生了变化,则引用对象的引用计数减一。当引用对象的引用计数为0的时候这表明,此对象值可回收。

  以上其实就是最为常用的内存回收机制,当然我们的内存回收机制是在一定的时间间隔后,自动的运行的,每次都会搜寻是否有变量可以收回,并回收内存。

三、内存泄漏

  内存泄漏是指在我们编码的过程中,有的某一些操作是的当前的内存块即使不在会被使用到,释放机制也因为辨别不出(bug啦)是否需要释放而使得这一不需要的变量得以保留。虽然对于有内存回收机制的js和java是很少有这种情况发生的。但是。。。你懂得,下面就来看一看有哪些情况会导致这一情况

  1、当我们在IE中使用.onclick的时候如果我们没有手动的删除这一事件则会造成和内存泄漏(IE果然好坑啊)

 document.getElementById("xxx").onclick = fuction(){};
//在IE中是不会自动的回收内存的。 //改进方法
document.getElementById("xxx").onclick = fuction(){
document.getElementById("xxx").onclick = null;
.......
}; //或者使用
document.getElementById("xxx").addEventListener(......);

  2、当我们对于DOM对象使用循环引用的情况下,js的回收机制就没有办法回收了。

 var a = document.getElementById("xxx");
a.r = a;

  3、必报在编写过程中的时候是经常要使用到的一个概念。但是但我们在闭包中定义了响应时间的时候就会造成一定量的内存占用。

 function bindEvent()
{
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
}//这样闭包内的obj元素回因为其中的onclick时间的绑定而没有办法进行释放,这样就造成了运行时的内存浪费。

  4、某些代码不严谨可能导致内存泄漏

 a = {p: {x: 1}};
b = a.p;
delete a.p;//a中的元素实际上已已经删除了,可是被删除的元素并没有清空,因为外部中变量b指向了这一元素数据。这样就可能造成内存的浪费

  5、最后,我们在来黑IE一把,实际上在IE中有一些DOM操作或者是属性转化的操作会造成相关的内存泄漏的风险,所以说我们在编写适配IE浏览器的时候还是要更为的注意一些的啊。

  内存泄漏的情况绝对不仅仅是我上面说的着一些,在我们的平时编写代码的过程中我们可以找到更多的这样的bug并对其进行相关的优化,将会使得我们的代码更为的良好而健壮。

  

JS内存知识点汇总的更多相关文章

  1. js常用知识点汇总

    1.json字符串与json对象相互转化(转至:http://www.jb51.net/article/43136.htm) SON字符串: var str1 = '{ "name" ...

  2. 前端开发 JavaScript 干货知识点汇总

    很多初学的朋友经常问我,前端JavaScript都需要学习哪些东西呀?哪些是JavaScript的重点知识啊? 其实做前端开发工程师,所有的知识点都是我们学习必备的东西,只有扎实的技术基础才是高薪的关 ...

  3. BBS项目知识点汇总

    目录 bbs项目知识点汇总 一. JavaScript 1 替换头像 2 form表单拿数据 3 form组件error信息渲染 4 添加html代码 5 聚焦操作 二 . html在线编辑器 三 . ...

  4. JS重要知识点

    这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...

  5. JS重要知识点(转载 学习中。。。)

    这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...

  6. nginx几个知识点汇总

    WHY? 为什么用Nginx而不用LVS? 7点理由足以说明一切:1 .高并发连接: 官方测试能够支撑 5 万并发连接,在实际生产环境中跑到 2 - 3 万并发连接数.?2 .内存消耗少: 在 3 万 ...

  7. JS 进阶知识点及常考面试题

    将会学习到一些原理相关的知识,不会解释涉及到的知识点的作用及用法,如果大家对于这些内容还不怎么熟悉,推荐先去学习相关的知识点内容再来学习原理知识. 手写 call.apply 及 bind 函数 涉及 ...

  8. 清华大学OS操作系统实验lab1练习知识点汇总

    lab1知识点汇总 还是有很多问题,但是我觉得我需要在查看更多资料后回来再理解,学这个也学了一周了,看了大量的资料...还是它们自己的80386手册和lab的指导手册觉得最准确,现在我就把这部分知识做 ...

  9. js基础系列框架:JS重要知识点(转载)

    这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...

随机推荐

  1. springboot整合Ehcache

    首先引入maven包: <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...

  2. JS中原型链的理解

    new操作符具体干了什么呢?其实很简单,就干了三件事情. var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj); 第一行,我们创建了 ...

  3. hibernate 操作 Postgresql 数据库报 operator does not exist: integer = character varying

    网上的说法如下: Java开发Postgresql 数据库兼容应用的问题,与Oracle有一些不同: Java类型映射数据库类型的不同,Oracle jdbc驱动程序处理Java String类型可正 ...

  4. SpringMVC:学习笔记(6)——转换器和格式化

    转换器和格式化 说明 SpringMVC的数据绑定并非没有限制,有案例表明,在SpringMVC如何正确绑定数据方面是杂乱无章的,比如在处理日期映射到Date对象上. 为了能够让SpringMVC进行 ...

  5. python3 多线程编程

    python / 并发 / 线程 / 对象 / 编程   0.什么是线程 1. 多线程模块 2. 创建线程的方法 3. join()方法 4.isAlive()方法 5. name属性和daemon属 ...

  6. python有哪些好的学习资料或者博客?

    推荐Full Stack Python 有各种python资源汇总,从基础入门到各种框架web应用开发和部署,再到高级的ORM.Docker都有.以下是Full Stack Python 上总结的一些 ...

  7. 016_笼统概述MapReduce执行流程结合wordcount程序

    数据传输<key,value>     File-->  <key,value>  -->map(key,value)  --> mapResult<k ...

  8. Linux Shell编程 条件判断语法

    if条件判断语句 单分支 if 条件语句 语法格式: if [条件判断式];then 程序 fi 或者 if [条件判断式] then 程序 fi 在使用单分支 if 条件查询时需要注意几点: if ...

  9. TIJ读书笔记01-操作符

      TIJ读书笔记01-操作符 概述 关系操作符和逻辑操作符 位操作符 类型转换 概述 操作符 操作符接受一个或多个参数,并生成一个新值. 换句话说操作符作用于操作数,生成一个新值.有些操作符会改变操 ...

  10. 在freescale mx6q平台上添加spi资源

    1:配置管脚为SPI功能 在board-mx6q_sabresd.h的最后添加,复制被重定义 (以添加SPI2为例) <span style="font-size:18px;" ...