内存管理和内存泄露
内存管理:在代码执行的过程中都是需要我们分配内存的,不同的是某些编程语言需要我们自己手动的管理内存,某些编程语言可以自动帮助我们管理内存。 内存管理的生命周期:
- 分配申请你需要的内存(申请)
- 使用分配的内存(存放一些东西,比如对象等)
- 不需要使用时,对其进行释放 不同的编程语言对内存管理实现:
- 手动管理内存:C、C++、OC
- 自动管理内存:Java、Python、JavaScript、Swift、Dart...
JavaScript内存管理
定义变量时分配内存,关闭页面的时候自动对变量进行回收
内存的分配方式:
- 基本数据类型:对于基本数据类型内存的分配会在执行时,直接在栈空间
- 复杂数据类型:对于复杂数据类型内存的分配堆空间开辟一块空间存放数据,栈空间存放指向堆空间的引用地址
JavaScript垃圾回收
垃圾回收器我们简称GC, 是指对不再使用的对象当做垃圾一样对内存进行回收,对其进行释放,以便腾出更多的内存空间
手动垃圾回收的语言中需要自己释放内存,比如使用free函数,1.效率极低 2.容易产生内存泄露
常用的垃圾回收算法:引用计数
var obj = { name: "why" };
var info = {name: "kobe", friend: obj};
var p = {name: "James", friend: obj}
当发生引用以后,计数器就会叠加1,obj的retain count结果为3,当info的friend指向null或者指向别的地址以后retain count的结果就会减去1,当发现obj的retain count的结果为0的时候,那么obj就会被当做垃圾进行回收.
引用计数的缺点可能会导致循环引用,例如:
var obj1 = {friend: obj2};
var obj2 = {friend: obj1};
//解决方法obj1.friend = null;
如果像这样处理不及时可能会导致内存泄漏,解决方法可以使用标记清除方法
常用的垃圾回收算法:标记清除
设置一个根对象,垃圾回收器会定期从这个根开始,找所有从根开始有引用到的对象,对于哪些没有引用到的对象,就认为不可用的对象