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程序的运行,当对象不再使用时,就自动释放对象所 ...
随机推荐
- JavaScript进阶系列1:performace和console.time性能测试
测试性能的时候,三种方法: 1.使用new Date() 返回整数值ms var dtStart=new Date(); for(var i=0;i<15000;i++){ i=i; } var ...
- ibatis项目应用
创建数据库表: create table u_student( student_id number 16, student_name varchar2(108), student_code numbe ...
- Redhat 6.3上安装libssh
遇到了很多坑,决定记录下来,有些经验还是很有帮助的. 最重要的一条就是:安装rpm包,总是比编译源码安装(make&make install)更快.记住两个rpm网站:https://pkgs ...
- pip更新
python -m ** install -U **
- axios 发送post请求的时候会发送两次
第一次发送的时候会先发送OPTIONS, 第二次才发送POST, 解决方法: 引用qs模块 安装qs依赖 npm install qs --save 引入qs依赖 import qs from 'qs ...
- presto 判断数据量是否大于一个比较小的值的优化
问题来源于以下场景: 我们需要对一张数据表做导出文件操作,需要判断如果数据量不多的时候,直接导出提供下载,如果数据量超过一定数值,则异步处理导出和下载. 这里就引入一个问题,如果我们直接count一张 ...
- vue使用动态渲染v-model输入框无法输入内容
最近使用ElementUI框架,在动态渲染表单的时候,表单框无法输入内容,但是绑定model的数据是会发生变化 解决方法: 将动态生成的表单对象,深拷贝到 data 对象中 <el-date-p ...
- Apache代理转发http到https
site.conf ProxyPass /maps https://maps.googleapis.com/maps LoadModule proxy_module modules/mod_proxy ...
- Visual Assist X 中使用doxygen的模板注释
http://blog.csdn.net/dhifnoju/article/details/44947213 Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C.C+ ...
- cin.get();cin.clear();cin.sync()
先看代码: #include<iostream> using namespace std; int main(){ int c,x; cout<<"输入大小" ...