Node高效使用内存

变量的主动释放

如果变量是全局变量,由于全局作用于需要直到进程退出才能释放,此时将导致引用的对象常驻内存(常驻在老生代中),如果需要释放常驻内存的对象,可以通过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模块用于处理大文件。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值