变量的主动释放
如果变量是全局变量,由于全局作用于需要直到进程退出才能释放,此时将导致引用的对象常驻内存(常驻在老生代中),如果需要释放常驻内存的对象,可以通过delete操作来删除引用关系。或者将变量重新赋值,让旧的对象脱离引用关系,但在V8中通过delete删除对象的属性有可能干扰V8的优化,所以通过赋值方式解除引用更好:变量 = null ;
闭包
在JavaScript中,实现外部作用域访问内部作用域中变量的方法叫闭包.
var foo = function() {
var bar = function() {
var loacal = '局部变量'
return function() {
return local
}
}
var baz = bar()
console.log(baz())
}
闭包是JavaScript的高级特性,利用它可以产生很多巧妙的效果,它的问题在于,一旦有变量引用这个中间函数,这个中间函数将不会释放,同时也会使原始的作用域不会得到释放,作用域中产生的内存占用也不会得到释放。
堆外内存
Buffer所占用的内存不是通过V8分配的,属于堆外内存,Buffer是一个像Array的对象,它主要用于操作字节,Buffer在文件I/O和网络I/O中运用广发,尤其在网络传输中,它的性能举足轻重。在网络中传输,都需要转换为Buffer,以进行二进制数据传输,提高字符串到Buffer的转换率,可以极大提高网络吞吐率。
慎将内存当作缓存
缓存在应用中的作用举足轻重,可以十分有效的节省资源,因为它的访问效率要比I/O的效率高,一旦命中缓存,就可以节省一次I/O时间。
但在Node中,缓存并非物美价廉。一旦一个对象被当作缓存来使用,那就意味着它将常驻在老生代内存中。缓存中存储的键越多,长期存活的对象也就越多,这将导致垃圾回收在进行扫描和整理时,对这些对象做无用功。
开发者通常喜欢用对象的键值对来缓存东西,但这与严格意义的缓存是由区别的,严格意义的缓存有完善的过期策略,而普通对象的键值对没有。
在Node中主要可以通过以下方案解决缓存问题:
1、将缓存转移到外部,减少常驻老生代内存的对象数量,让垃圾回收更高效。
2、进程之间共享缓存。
大内存应用
使用stream模块用于处理大文件。