视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
nodejs垃圾回收的详细介绍
2020-11-27 19:29:27 责编:小采
文档

本篇文章给大家带来的内容是关于nodejs垃圾回收的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

nodejs的垃圾回收机制是由v8引擎自动管理的。

nodejs的内存

在一般的后端语言(php)来说,内存的使用上是没有的,但对于nodejs来说只能使用系统的部分----位系统为1.4G,32位系统位0.7G。这时如果你要处理个3G文件进行数据分析,即使系统的内存为8G,在该nodejs进程内存还是会溢出。

造成上面这个问题主要是因为nodejs是基于v8的,nodejs是通过v8自己的方式来管理内存的。那v8为什么要堆内存的大小呢?原因有2:

1、表层原因:v8是为浏览器设计的,不大可能遇到大内存的情景。

2.深层原因:v8垃圾回收机制的。以1.5G的堆内存为例,v8做一次小的垃圾回收需要50ms,做一次非增量的垃圾回收要1s。垃圾回收时会引起js的线程的暂停,在这样的时间花销下,应用的性能、响应能力会直线下降。

内存是可以打开的:
--max-old-space-size(老生代)
--max-new-space-size(新生代)
v8堆内存大小 = 老生代 + 新生代

v8垃圾回收机制
v8垃圾回收主要是基于分代式垃圾回收机制。按对象的存活时间将内存的垃圾回收进行不同的分代,分别对不同的分代内存进行不同的算法。

新生代--->存活时间较短的对象
老生代--->存活时间较长或常驻内存的对象
上面也说过,nodejs堆内存的大小是新生代内存空间加上老生代内存空间。

新生代算法
新生代主要是通过scavenge算法进行垃圾回收。

这是一种采用复制的方式来实现垃圾回收,将堆内存一分为二,每个空间称为semispace。在这2个semispace空间中,只有一个处于使用中(称为from空间),另一个处于空闲中(称为to空间)。开始分配时首先从from空间开始,当开始垃圾回收时,也是从from空间开始检查存活对象,把存活对象复制到to空间,而非存活对象占用的空间就会被释放。完成复制后,from空间和to空间角色对调。
从上面的过程可以知道,scavenge的缺点就是只使用了一半的堆内存,牺牲空间获取时间。

老生代通过mark-sweep、mark-comopact算法。

mark-sweep标记清除,分为标记、清除2个阶段。mark-sweep先在标记阶段遍历堆内存中的所有对象,并标记存活的对象;在清除阶段把没有被标记的对象清除。可以看出,scavenge只复制存活的对象,mark-sweep只清理死亡的对象。因为在新生代中存活的对象占用小部分,而在老生代中死亡对象占用小部分,这是这2中算法高效的原因。

Mark-compact标记整理,mark-sweep中会出现一个问题,在回收后,对内存会出现不连续的状态(内存碎片)。内存碎片会对后续的内存分配造成影响,因为会有这样一种情况:需要分配个大内存,而所有内存碎片都无法完成分配,这会提前触发垃圾回收,而这个回收时不必要的。Mark-compact是在Mark-sweep基础上演变而来的,它主要区别在于:对象被标记后,在整理的过程中会将存活的对象都往一端移动,移动完成后直接清除。

小结:在正常的使用过程中,v8的内存还是够用的,但nodejs的垃圾回收、单线程还是会影响性能。想要高性能,需要让垃圾回收尽量小。在实际的开发中要老生代对象的使用,如实现web服务的会话(session),一般会通过内存来存储(数组),在访问量大的情况下会导致老生代对象剧增,有可能造成溢出。如果要处理大内存的数据,比如读取3G的文件,我们会通过可读流的pipe()方法,这样就不会受到v8内存的影响,提高了nodejs程序的健壮性。

下载本文
显示全文
专题