JS内存知识点汇总
废话片:
讲到内存可以联想到很多,内存分配管理,内存回收机制,内存泄露等等,今天我们就来答题的总结一下。
正文片:
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内存知识点汇总的更多相关文章
- js常用知识点汇总
1.json字符串与json对象相互转化(转至:http://www.jb51.net/article/43136.htm) SON字符串: var str1 = '{ "name" ...
- 前端开发 JavaScript 干货知识点汇总
很多初学的朋友经常问我,前端JavaScript都需要学习哪些东西呀?哪些是JavaScript的重点知识啊? 其实做前端开发工程师,所有的知识点都是我们学习必备的东西,只有扎实的技术基础才是高薪的关 ...
- BBS项目知识点汇总
目录 bbs项目知识点汇总 一. JavaScript 1 替换头像 2 form表单拿数据 3 form组件error信息渲染 4 添加html代码 5 聚焦操作 二 . html在线编辑器 三 . ...
- JS重要知识点
这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...
- JS重要知识点(转载 学习中。。。)
这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...
- nginx几个知识点汇总
WHY? 为什么用Nginx而不用LVS? 7点理由足以说明一切:1 .高并发连接: 官方测试能够支撑 5 万并发连接,在实际生产环境中跑到 2 - 3 万并发连接数.?2 .内存消耗少: 在 3 万 ...
- JS 进阶知识点及常考面试题
将会学习到一些原理相关的知识,不会解释涉及到的知识点的作用及用法,如果大家对于这些内容还不怎么熟悉,推荐先去学习相关的知识点内容再来学习原理知识. 手写 call.apply 及 bind 函数 涉及 ...
- 清华大学OS操作系统实验lab1练习知识点汇总
lab1知识点汇总 还是有很多问题,但是我觉得我需要在查看更多资料后回来再理解,学这个也学了一周了,看了大量的资料...还是它们自己的80386手册和lab的指导手册觉得最准确,现在我就把这部分知识做 ...
- js基础系列框架:JS重要知识点(转载)
这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...
随机推荐
- 基于websocket搭建简易群聊
1.前端HTML <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&qu ...
- Android的代码都得自己一个个敲一遍吗?
近期在Android学习中,碰到一个头疼的问题.众所周知Android是一个开发源码的平台,网上有非常多网友分享的关于各种样例的demo,比方扫描二维码,瀑布流等,对于前人已有的成果,我们 ...
- SpringBoot入门1—简介及helloworld
Spring Boot简介 Spring Boot让我们的Spring应用变的更轻量化.比如:你可以仅仅依靠一个Java类来运行一个Spring引用.你也可以打包你的应用为jar并通过使用java - ...
- Docker基础入门实践
原文地址 基本概念 Docker三个基本概念 镜像(Image) 容器(Container) 仓库(Repository) 镜像 镜像可以理解为只读模板,如包含一个centos操作系统环境 容器 Do ...
- bootstrap模板
一.bootstrap基本介绍 1.什么是bootstrap? bootstrap就是个前端快速开发的工具,该工具是个简单.直观.强悍的前端开发框架,让web开发更加迅速简单,同时也是个响应式布局,兼 ...
- List contents of directories in a tree-like format
Python programming practice. Usage: List contents of directories in a tree-like format. #!/usr/bin/p ...
- NSOperation简介
1.NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程. 2.NSOperation和NSOperationQueue实现多线程的具体步骤 ...
- 函数编程——匿名函数与lambda(一)
python允许用lambda关键字创造匿名函数. 匿名函数是因为不需要以标准的方式来声明,比如说,使用def语句. 但是,作为函数,它们也能有参数. 一个完整的lambda“语句”代表了一个表达式, ...
- sharepoint 2010自定义访问日志列表设置移动终端否和客户端访问系统等计算列的公式
上个月本人开发和上线了一个在SharePoint 2010上基于HTML5的移动OA网站,后端服务采用自定义的基于AgilePoint工作流引擎的Sharepoint Web服务,前端主要采用Jque ...
- event driven model
http://www.jdon.com/eda.html http://blog.csdn.net/gykimo/article/details/9182287 事件代表过去发生的事件,事件既是技术架 ...