# 内存管理
# node的 v8
v8内存限制
- 64位系统 --- 1.4GB
- 32位系统 --- 0.7GB
v8 对象内存分配
- 所有的javascript对象都是通过堆来进行分配内存
# 查看内存分配
$ node
> process.memoryUsage()
process.memoryUsage()
返回四个属性rss(resident set size)
所有内存占用,包括指令和堆栈heapTotal
'堆' 占用的内存,包括用到的和没有用到的heapUsed
用到的堆的部分external
v8 引擎内部的 c++ 对象占用的内存
# v8中的垃圾回收机制
- 对象的生存周期长短不一,不同的算法只能针对特定情况具有最好的效果。统计学在垃圾回收算法的发展中产生来较大的作用,现代的垃圾回收算法中按对象的存活时间将内存的垃圾回收进行不同的分代,然后分别对不同的分代的内存施以更高效的算法
# v8的内内存分代
- 分为
新生代
和老生代
- 新生代的对象为
存活时间较短的对象
- 老生代中的对象为
存活时间较长
或常驻内存的对象
- 新生代的对象为
# 高效使用内存
# 作用域(scope)
- 函数
var foo = function() {
var local = {}
}
foo()函数在每次调用时会创建对应的作用域,函数执行结束后,作用会被销毁
随着作用域销毁,所声明的局部变量也被回收
- 变量的主动释放
- 全局变量 ----
由于全局作用域需要直直到进程退出才能释放
- 释放常驻内存的对象,可以通过delete操作来删除引用关系。或是重新赋值,让旧的对象脱离引用关系
- 全局变量 ----
global.foo = 'hallo world';
console.log(global.foo)
delete global.foo // 可能会干扰v8的优化
// 或重新赋值
global.foo = undefined; // or null 推荐
# 闭包
- 实现外部作用域访问问内部作用域中变量的方法叫
闭包
var foo = function() {
var bar = function() {
var local = '局部变量'
return function() {
return local
}
}
var bar = bar()
console.log(bar)
}
说明
一旦有变量引用这个中间函数,中间函数将不会得到释放,同时也会使原始的作用域不会得到释放,作用域中产生的内存占用也不会得到释放。
# 查看系统内存占用
os.totalmem()
--- 系统总内存 (kb)os.freemem()
--- 闲置内存 (kb)
# 内存泄漏
- 缓存
- 队列消息不及时
- 作用域未释放