oliver1204 / randomNotes

用来记录平时的日常总结
1 stars 0 forks source link

内存 #71

Open oliver1204 opened 6 years ago

oliver1204 commented 6 years ago

JavaScript 栈内存和堆内存

为了不让程序员费心分配内存,JavaScript 在定义变量时就完成了内存分配。JavaScript 的变量类型分为两种:基本类型和引用类型。而在JavaScript 中内存也分为栈内存和堆内存两种。

基本类型包括:Undefined,Null,Number,String,Boolean类型的值。 引用类型包括: Object,Function,Array等类型。

一般来说,栈内存中存放的是存储对象的地址,而堆内存中存放的是存储对象的具体内容。对于原始类型的值而言,其地址和具体内容都存在与栈内存中;而基于引用类型的值,其地址存在栈内存,其具体内容存在堆内存中。堆内存与栈内存是有区别的,栈内存运行效率比堆内存高,空间相对推内存来说较小,反之则是堆内存的特点。

var str = "Hello World"; // str:"Hello World"存在栈中
var obj = {value:"Hello World"}; // obj存在栈中,{value:"Hello World"}存在堆中,通过栈中的变量名obj(访问地址)访问

对象生命周期

1.当对象将被需要的时候为其分配内存 2.使用已分配的内存(读、写操作) 3.当对象不在被需要的时候,释放存储这个对象的内存

var str_a = "a"; // 为str_a分配栈内存:str_a:"a"
var str_b = str_a; // 原始类型直接访问值,so,为str_b新分配栈内存:str_b:"a"

str_b = "b"; // 栈内存中:str_b:"b"。str_b的值为"b",而str_a的值仍然是"a"
// 分隔 str 和 obj -----------------------------------------------------------//
var obj_a = {v:"a"}; // 为obj_a分配栈内存访问地址:obj_a,堆内存中存对象值:{v:"a"};
var obj_b = obj_a; // 为obj_b分配栈内存访问地址:obj_b,引用了堆内存的值{v:"a"}

obj_b.v = "b"; // 通过obj_b访问(修改)堆内存的变量,这时候堆内存中对象值为:{v:"b"},由于obj_a和obj_b引用的是堆内存中同一个对象值,所以这时候打印都是{v:"b"}

obj_b = {v:"c"}; // 因为改的是整个对象,这里会在堆内存中创建一个新的对象值:{v:"c"},而现在的obj_b引用的是这个对象,所以这里打印的obj_a依旧是{v:"b"},而obj_b是{v:"c"}(两者在内存中引用的是不同对象了)。

浏览器堆栈

js引擎线程 无论什么时候都只有一个 JS 线程在运行 JS 程序, 想象一下,如果js 也是多线程的,就会出现这种情况:A 线程 在一个 DOM 节点插入一个元素,此时 B 线程 要删除这个节点,那么这个时候就会出现错乱的现象。

  1. js线程——>http线程——>事件触发线程(把回调插入js线程尾部)——>js线程 image

  2. setTimeout/setInterval 定时触发器线程(完成之后插入js线程尾部)——>js线程

垃圾回收的方式

垃圾回收的目的是,当内存不再需要使用时释放,并回收。

引用计数垃圾收集

这是最简单的垃圾收集算法。

http://blog.csdn.net/web_lc/article/details/72920029