当前栏目
JavaScript垃圾回收(一)——内存分配
一、静态分配( Static Allocation )
从静态存储区域分配内存。程序编译的时候内存已经分配好了,并且在程序的整个运行期间都存在,如静态变量和全局变量。
如下面这张网上找的图:把房间看做一个程序,我们可以把静态分配的内存当成是房间里的耐用家具。通常,它们无需释放和回收,因为没人会天天把大衣柜当作垃圾扔到窗外。
二、自动分配( Automatic Allocation )
在栈中为局部变量分配内存的方法,栈中的内存可以随着代码块退出时的出栈操作被自动释放。例如在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数结束时这些存储单元自动被释放。
如下面这张网上找的图:这类似于到房间中办事的人,事情一旦完成,就会自己离开,而他们所占用的空间,也随着这些人的离开而自动释放了。
栈是一种后进先出的数据结构,在javascript中可以通过Array来模拟栈的行为。
var arr = []; //创建一个栈 arr.push("apple");//压入元素"apple" ["apple"] arr.push("orange");//压入元素"orange" ["apple","orange"] arr.pop();//弹出"orange" ["apple"] arr.push("banana");//压入元素"banana" ["apple","banana"] console.log(arr);
与之对应的内存图:
用firefox打印出的结果如下:
三、动态分配( Dynamic Allocation )
在堆中动态分配内存空间以存储数据的方式。也就是程序运行时用malloc或new申请的内存,我们需要自己用free或delete释放。
如下面这张网上找的图:堆中的内存块好像我们喝过的空瓶等,用过了就得扔到垃圾箱里,否则屋内就会满地狼藉。
堆是存放数据的基于散列算法的数据结构,在javascript中,引用值是存放在堆中的。
function Person(id,name,age) { this.id = id; this.name = name; this.age = age; } var num = 10; var bol = true; var str = "abc"; var obj = new Object(); var arr = ['a','b','c']; var person = new Person(100,"pwstrick",25);
懒人们都希望有一台家用机器人跟在身边打扫卫生。
在软件开发中,如果你懒得释放内存,那么你也需要一台类似的机器人——一个由特定算法实现的垃圾收集器。而正是垃圾收集机制本身的一些缺陷,导致了javascript内存泄露。
demo下载:
http://download.csdn.net/detail/loneleaf1/8031073
参考资料:
http://kb.cnblogs.com/page/74836/ GC与JS内存泄露
http://kb.cnblogs.com/page/77087/ 理解Javascript_01_理解内存分配
http://www.cnblogs.com/yuzhongwusan/archive/2012/03/27/2418964.html javascript的内存分配
相关文章
- js日志输出还是只会console.log么,那你就out了
- Jackson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo
- Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换
- @JsonCreator自定义反序列化函数-JSON框架Jackson精解第5篇
- Jackson精解第4篇-@JacksonInject与@JsonAlias注解
- 属性序列化自定义与字母表排序-JSON框架Jackson精解第3篇
- URL及日期等特殊数据格式处理-JSON框架Jackson精解第2篇
- JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法
- 通过java程序(JSch)运行远程linux主机上的shell脚本
- JS/TS项目里的Module都是什么?
- 为啥JS/TS里都会有"use strict"
- api接口返回动态的json格式?我太难了,尝试一下 linq to json
- 教你如何解决JS/TS里特定String进行拆分然后遍历各个元素
- 对 JsonConvert 的认识太肤浅了,终于还是遇到了问题
- knockoutjs如何动态加载外部的file作为component中的template数据源
- 掌握这20个JS技巧,做一个不加班的前端人
- 如何在TypeScript/JavaScript项目里引入MD5校验和
- Javascript之旅——终点站:困惑的settimeout
- Javascript之旅——第十一站:原型也不好理解?
- Javascript之旅——第十站:为什么都说闭包难理解呢?