nodejs中的垃圾回收机制

摘要:
旧一代64位1.4GB32位700MB新一代64比特32MB32位16MB垃圾收集算法:清除算法[skavindg]新一代主要使用清除算法进行垃圾收集,该算法主要使用切尼算法。切尼算法[切尼]是一种通过复制实现的垃圾收集算法。它将堆内存分成两部分,空间的每一部分都成为一个空间。这种内存碎片将导致后续内存分配问题。一旦需要分配一个大型对象,所有碎片空间都无法完成此分配,将提前开始垃圾收集。这种垃圾收集是不必要的。

node是基于V8引擎开发的,V8的设计是为浏览器设计的,所以V8的内存相对较少,当然可以通过 node --max-old-space-size=1700 (单位是MB) 或 node --max-new-space-size=1024(单位是KB)来进行设置。
V8的内存分代分为两代,一种是新生代,主要存放对象为存活时间较短的对象,另一种是老生代,主要存放较长时或常驻内存的对象。
老生代 64位下 1.4GB 32位下 700MB
新生代 64位下 32MB 32位下 16MB

垃圾回收算法:
Scavenge算法[skavindg]
新生代主要是通过Scavenge算法进行垃圾回收,该算法主要采用了Cheney算法。
Cheney算法[切尼]
是一种采用了复制的方式实现的垃圾回收算法,它将堆内存一分为二,每一部分空间成为semispace。在这两个semispace空间中,只有一个处于使用中,另一个处于闲置状态。处于使用中的空间称为FROM空间,处于闲置状态的空间称为TO空间,在我们分配对象时,先在FROM空间中进行分配。
垃圾回收时,先在FROM空间中查找存活的对象,将其复制到TO空间中,而非存活的对象将会被释放,随后对FROM和TO空间进行角色对换,如果,一个对象经过多次复制依然存活时,他将会被认为是生命周期较长的对象,这种生命周期较长的对象将会被移动到老生代中,采用新的算法进行管理,该过程称之为晋升。
Scavenge算法是典型的浪费空间换时间的算法。

晋升后的老生代采用Mark-Sweep和Mark-Compact算法
Mark-Sweep算法:
是在标记阶段遍历堆中所有的对象,并标记活着的对象,在随后的清除阶段中,只清除没有被标记的对象。
Scavenge算法是只复制活着的对象,而Mark-Sweep只清除死亡的对象。
但是Mark-Sweep算法存在一个重大的问题就是进行一次清理后,会造成内存碎片,使内存出现不连续的状态。这种内存碎片会对后续的内存分配造成问题,一旦有一个大对象要分配的情况,所有的碎片空间都无法完成此次分配,就会提前出发垃圾回收,而这次垃圾回收是没有必要的。因而为了解决Mark-Sweep内存碎片问题,Mark-Compact被提出来。
Mark-Compact算法:
是标记整理的意思,是在Mark-Sweep的基础上演变而来的,差别在于对象在标记为死亡后,在整理的过程中,将活着的对象往一端移动,移动完成后,直接清理掉边界外的内存,完成回收。

回收算法Mark-SweepMark-CompactScavenge
速度中等最慢最快
空间开销少(有碎片)少(无碎片)双倍空间(无碎片)
是否移动对象

免责声明:文章转载自《nodejs中的垃圾回收机制》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【snmp】win7安装和配置snmpDocker基础入门下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

vue之文本渲染

以前,我们一直使用{{}}的形式来呈现文本,但除了此方法之外,vue还提供了其他几种常见的文本呈现方法:v-text:更新元素的innerTextv html:更新元素一次的innerHTMLv:静态插值v-pre:以原始格式输出v-cooke:保留元素上的指令,直到相关实例完成编译˂!幸运的是,Vue还提供了v-text和v-html来呈现文本或元素。...

解决安卓手机连接wifi总弹出“已登录到Wlan网络”

一些Android机型在连接到wifi时会不断提示,“如果你不小心打开了这个提示,你会跳转到一些广告网站。这是因为谷歌服务器会在本地Android系统通电后发送连接请求。”。一些手机制造商的工程师将此连接服务器设置到一些广告网站并登录网络“我们可以管理设备或手机模拟器的状态,还可以执行许多手机操作,如安装软件、升级系统、运行shell命令等。adb是连接安卓...

Linux查看机器和硬盘的SN

查看硬件RAID中硬盘的SN#sas端口:[root@~]$smartctl-a/dev/sda dmegaraid,n***序列号:6RJ974SR***#sat端口[root@~]$smarttl-a/dev/sda-dsat+megaraid,n***序列号:6BRJ974SR***查看机器SN[root@~~]$dmidcode-t1**序列号...

IIS 中 "另一个程序正在使用此文件,进程无法访问!"

然而,自从昨晚重新启动机器后,发现iis无法启动。手动启动并提示:“另一个程序正在使用此文件,进程无法访问它!”百度得知这是由港口冲突造成的。什么软件使用端口80?同时,我更改了iis的默认端口80,没问题。接下来,我想知道是哪一方秘密占用了端口80。但是,在执行上述命令后,我没有找到占用端口80的程序。我惊讶地发现没有人占用端口80。...

shell脚本之数组

declare-AARRAY_NAME:声明关联数组。数组中元素的赋值方式:一次只赋值一个元素;ARRAY_NAME[INDEX]=value一次赋值全部元素;ARRAY_NAME=注意:元素与元素之间使用空格字符隔开只赋值特定元素;这种称之为稀疏格式的数组。/bin/bash#declare-aranddeclare-imax=0foriin{1..10}...

电脑不识别USB blaster驱动问题

电脑不识别USB blaster,如下图: 解决办法:手动更新...