技术干货

Node之内存管理

2017-09-07  本文已影响43人  人失格

V8的垃圾回收机制与内存限制

一般的后端开发语言中,基本的内存使用上没有什么限制,然而在Node中通过Javascript使用内存时就会发现只能使用部分内存(64位系统中约为1.4GB,32位系统中约为0.7GB)。这样限制,会导致2GB的文件读取内存无法进行字符串分析处理,即使物理内存有32GB,在Node单进程中,计算机的内存资源无法得到充分的使用。

背后核心的问题在于Node基于V8构建,Node中使用的JS对象基本上都是通过V8的方式分配和管理,V8在浏览器足够使用,但是在后台服务器开发中却无法满足需求。

查看内存使用情况

node 
precess.memoryUsage()

V8的垃圾回收机制

V8的垃圾回收算法

主要是基于分代垃圾回收机制,现在的垃圾回收算法中按照对象的存活事件将内存的垃圾回收进行不同的分代,然后对不同分代的内存施以更高效的算法。

高效使用内存

作用域

  1. JS的作用域只有函数调用,以及全局作用域

  2. 函数调用

    函数在每次被调用会创建对象的作用域,函数执行结束,该作用域将会销毁,同事作用域中声明的局部变量分配在该作用域上,随着作用域的销毁而在下次垃圾回收时被释放

  3. 变量的主动释放

    如果变量私全局变量,由于全局作用域需要直接到进程退出才能释放,此时将导致引用的对象常驻内存,此时如果需要释放常驻内存的对象,可以将变量重新赋值null defined即可,接下来的老生代内存清楚和整理的过程中,会被回收释放。

  4. 闭包

    闭包的使用会导致,一旦变量引用了这个中间函数,这个中间函数就不会释放,同时也会使原始的作用域不会得到释放,除非不再引用,才会逐步释放。

内存的划分

大内存应用

Node主要提供了stream模块用于处理大文件

stream模块是Node的原生模块, stream继承EventEmitter,对于大文件我们无法通过fs.readFile()和fs.writeFile()直接进行大文件的操作,可以通过改用流的方式对大文件的操作

var reader = fs.createReadStream('in.txt')
var writer = fs.createWriteStream('out.txt')
reader.pipe(writer);
上一篇下一篇

猜你喜欢

热点阅读