nodejs中的垃圾回收机制
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-Sweep | Mark-Compact | Scavenge |
速度 | 中等 | 最慢 | 最快 |
空间开销 | 少(有碎片) | 少(无碎片) | 双倍空间(无碎片) |
是否移动对象 | 否 | 是 | 是 |
nodejs中的垃圾回收机制的更多相关文章
- 浅谈V8引擎中的垃圾回收机制
最近在看<深入浅出nodejs>关于V8垃圾回收机制的章节,转自:http://blog.segmentfault.com/skyinlayer/1190000000440270 这篇文章 ...
- Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略
V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...
- 浅谈Chrome V8引擎中的垃圾回收机制
垃圾回收器 JavaScript的垃圾回收器 JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带 ...
- Python中的垃圾回收机制
Python的垃圾回收机制 引子: 我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,而变量名是访问到变量值的唯一方式,所以 ...
- Javascript中的垃圾回收机制
Javascript 中的内存管理 译自MDN,Memory Management 简介 在底层语言中,比如C,有专门的内存管理机制,比如malloc() 和 free().而Javascript是有 ...
- Java中的垃圾回收机制
1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 ...
- JavaScript中的垃圾回收机制与内存泄露
什么是内存泄露? 任何编程语言,在运行时都需要使用到内存,比如在一个函数中, var arr = [1, 2, 3, 4, 5]; 这么一个数组,就需要内存. 但是,在使用了这些内存之后, 如果后面他 ...
- JAVA中的垃圾回收机制以及其在android开发中的作用
http://blog.csdn.net/xieqibao/article/details/6707519 这篇文章概述了JAVA中运行时数据的结构,以及垃圾回收机制的作用.在后半部分,描述了如何检测 ...
- Java中的垃圾回收机制&内存管理&内存泄漏
1. Java在创建对象时,会自动分配内存,并当该对象引用不存在的时候,释放这块内存. 为什么呢? 因为Java中使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再使用时,就自动释放对象所 ...
随机推荐
- 【网址】ILSpy,C# .net/dot net的反编译工具
ILSpy官网:http://ilspy.net/ ILSpy中文版:http://www.fishlee.net/soft/ilspy_chs/
- nginx插入lua脚本访问redis
目标:收集用户日志 流程: 浏览器端get方法将数据传到nginx服务 nginx收集到数据,执行内嵌lua脚本,访问redis,根据token获得用户id 将日志信息存入文件 1.nginx安装,参 ...
- 52. N-Queens II N皇后II
网址:https://leetcode.com/problems/n-queens-ii/ 方法1:按照逻辑思路,通过回溯法解决问题.速度较慢! class Solution { public: vo ...
- div模拟文本框textarea
需求:利用highlight.js对文本框中的内容进行高亮显示 1.highlight.js使用 js中:<script src="js/highlight/highlight.pac ...
- 关于leal和mov
最近在学习leal的时候遇到了一点非常迷惑的地方,就是leal是用来取有效地址的,但是为什么它也可以实现赋值呢?偶然发现一个博客讲的不错,遂自己记录一下 一个这样的例子 leal 7(%edx,%ed ...
- 【lintcode】二分法总结 II
Half and Half 类型题 二分法的精髓在于判断目标值在前半区间还是后半区间,Half and Half类型难点在不能一次判断,可能需要一次以上的判断条件. Maximum Number in ...
- Xshell配置使用linux的图形界面
1.配置Xshell如下图 2.在命令行中执行"gnome-panel". 3.或者使用xstart,配置如下图:
- JVM中的垃圾回收器及垃圾收集算法描述
首先需要了解下JVM(Java虚拟机)中的内存分配情况: 收集器的介绍: Serial收集器:是最原始的收集器,是单线程的,实现简单,但是在后台收集垃圾的时候,其他的工作线程都会停止,直到垃圾收集线程 ...
- 关于WinSock编程的多线程控制
1引言Windows Sockets规范以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Microsoft Windows下网络编程接口.它不仅包含了人们所熟悉 ...
- Dubbo源码构建
代码签出 通过以下的这个命令签出最新的项目源码: git clone https://github.com/apache/incubator-dubbo.git dubbo 分支 我们使用 maste ...