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中的垃圾回收机制的更多相关文章

  1. 浅谈V8引擎中的垃圾回收机制

    最近在看<深入浅出nodejs>关于V8垃圾回收机制的章节,转自:http://blog.segmentfault.com/skyinlayer/1190000000440270 这篇文章 ...

  2. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  3. 浅谈Chrome V8引擎中的垃圾回收机制

    垃圾回收器 JavaScript的垃圾回收器 JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带 ...

  4. Python中的垃圾回收机制

    Python的垃圾回收机制 引子: 我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,而变量名是访问到变量值的唯一方式,所以 ...

  5. Javascript中的垃圾回收机制

    Javascript 中的内存管理 译自MDN,Memory Management 简介 在底层语言中,比如C,有专门的内存管理机制,比如malloc() 和 free().而Javascript是有 ...

  6. Java中的垃圾回收机制

    1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 ...

  7. JavaScript中的垃圾回收机制与内存泄露

    什么是内存泄露? 任何编程语言,在运行时都需要使用到内存,比如在一个函数中, var arr = [1, 2, 3, 4, 5]; 这么一个数组,就需要内存. 但是,在使用了这些内存之后, 如果后面他 ...

  8. JAVA中的垃圾回收机制以及其在android开发中的作用

    http://blog.csdn.net/xieqibao/article/details/6707519 这篇文章概述了JAVA中运行时数据的结构,以及垃圾回收机制的作用.在后半部分,描述了如何检测 ...

  9. Java中的垃圾回收机制&内存管理&内存泄漏

    1. Java在创建对象时,会自动分配内存,并当该对象引用不存在的时候,释放这块内存. 为什么呢? 因为Java中使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再使用时,就自动释放对象所 ...

随机推荐

  1. 【网址】ILSpy,C# .net/dot net的反编译工具

    ILSpy官网:http://ilspy.net/ ILSpy中文版:http://www.fishlee.net/soft/ilspy_chs/

  2. nginx插入lua脚本访问redis

    目标:收集用户日志 流程: 浏览器端get方法将数据传到nginx服务 nginx收集到数据,执行内嵌lua脚本,访问redis,根据token获得用户id 将日志信息存入文件 1.nginx安装,参 ...

  3. 52. N-Queens II N皇后II

    网址:https://leetcode.com/problems/n-queens-ii/ 方法1:按照逻辑思路,通过回溯法解决问题.速度较慢! class Solution { public: vo ...

  4. div模拟文本框textarea

    需求:利用highlight.js对文本框中的内容进行高亮显示 1.highlight.js使用 js中:<script src="js/highlight/highlight.pac ...

  5. 关于leal和mov

    最近在学习leal的时候遇到了一点非常迷惑的地方,就是leal是用来取有效地址的,但是为什么它也可以实现赋值呢?偶然发现一个博客讲的不错,遂自己记录一下 一个这样的例子 leal 7(%edx,%ed ...

  6. 【lintcode】二分法总结 II

    Half and Half 类型题 二分法的精髓在于判断目标值在前半区间还是后半区间,Half and Half类型难点在不能一次判断,可能需要一次以上的判断条件. Maximum Number in ...

  7. Xshell配置使用linux的图形界面

    1.配置Xshell如下图 2.在命令行中执行"gnome-panel". 3.或者使用xstart,配置如下图:

  8. JVM中的垃圾回收器及垃圾收集算法描述

    首先需要了解下JVM(Java虚拟机)中的内存分配情况: 收集器的介绍: Serial收集器:是最原始的收集器,是单线程的,实现简单,但是在后台收集垃圾的时候,其他的工作线程都会停止,直到垃圾收集线程 ...

  9. 关于WinSock编程的多线程控制

    1引言Windows Sockets规范以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Microsoft Windows下网络编程接口.它不仅包含了人们所熟悉 ...

  10. Dubbo源码构建

    代码签出 通过以下的这个命令签出最新的项目源码: git clone https://github.com/apache/incubator-dubbo.git dubbo 分支 我们使用 maste ...