在Node中通过JavaScript使用内存时会发现只能使用部分呢内存(64位下位1.4GB,32位系统下位0.7GB),这样的限制使得Node无法操作大内存对象。造成这个问题的原因在于Node基于V8构建,所以在Node中使用的JavaScript对象基本上都是通过V8自己的方式来进行分配和管理的。
在V8中,所有的JavaScript对象都是通过堆来分配的。当我们在代码中声明变量并赋值的时候,所使用的对象就会分配在堆中。如果已申请的堆空闲内存不够分配新的对象,将继续申请堆内存,直到堆的大小超过V8的限制为止。V8限制堆大小的原因在于V8的垃圾回收机制的限制。

V8的垃圾回收机制

V8主要的垃圾回收算法

V8的垃圾回收策略主要基于分代式垃圾回收机制
(ps:本文参考《深入浅出Nodejs》)
1、V8的内存分代
在V8中,主要将内存分为新生代和老生代。新生代中的对象位存活时间较短的对象,老生代中的对象为存活时间较长或者常驻内存的对象。
新生代和老生代的内存空间在一开始就是指定的。
2、Scavenge算法
在分代的基础上,新生代中的对象主要通过Scavenge算法进行垃圾回收。
Scavenge的具体实现中,主要采用了Cheney算法

Cheney算法是一种采用复制的方式实现的垃圾回收算法。它将堆内存一分为二,每一部分空间成为semispace。在这两个semispace空间中,只有一个处于使用中,另一个处于闲置状态。处于使用状态的semispace空间叫做From空间,处于闲置状态的semispace空间叫to空间。当我们分配对象的时候,先从From空间空间中进行分配。当开始进行垃圾回收的时,会检查From空间中的存活对象,这些存活对象将被复制到To空间中,而非存活对象占用的空间将会被释放。完成复制后,From和To空间的角色发生对换。

简而言之,就是通过将存活对象在两个semispace空间之间进行复制。
从前面的机制来看,Scavenge是一种牺牲空间换时间的算法,所以无法大规模地应用到所有的垃圾回收中,但是Scavenge非常使用对象生命周期比较短的场景也就是适合用在新生代中

实际上的堆内存是新生代的两个semispace空间大小和老生代所使用内存大小之和

当一个对象经过多次复制仍然存活的时候,它就会被认为是身影周期比较长的对象,这种生命周期比较长的对象随后会被移动到新生代中,采用新的算法进行管理。从新生代到老生代的过程成为晋升

对象晋升的两个条件

  • 对象是否经历过Scavenge回收(通过检测内存地址是否改变)

    • 对象从From空间中复制到To空间中时,先判断这个对象是否经历过一次Scavenge回收,如果经历过,会从From空间复制到老生代空间,如果没有经历,则复制到To空间。
  • To空间的内存占用比是否超过闲置
    • 当一个对象从From空间复制到To空间时候,如果To空间使用率超过25%,则将该对象直接晋升到老生代中
    • 设置25%是因为当Scavenge回收结束之后,T空间会变成From空间,接下俩的内存分配会在这个空间进行,如果占比过高,会影响后续的内存分配

3、Mark-Sweep & Mark-Compact
老生代采用Mark-Sweep & Mark-Compact而不采用Scavenge算法的原因:采用Scavenge会导致再一半的空间浪费,第二是存活对象较多,复制存活对象的效率将会很低.
Mark-Sweep是标记清除的意思,它分为标记和清除两个阶段。Mark-Sweep在标记阶段遍历堆中所有对象,并标记活着的对象,在随后的清除阶段中,只清除没有被标记的对象。可以看出,Scavenge只复制活着的对象,而Mark-Sweep只清除死亡对象。活对象在新生代中只占较小部分,死对象在老生代中只占较小部分,这是两种回收方式能高效处理的原因。

Mark-Sweep的最大问题在于一次标记清除之后,内存空间会出现不连续的状态,这种内存碎片会对后续的内存分配造成问题,当无法完成此次分配的时候,就会触发一次垃圾回收。

Mark-Compact是为解决Mark-Sweep内存碎片提出来的。Mark-Compact是标记的意思。他们的差别在与标记为死亡后,在整理的过程中,将活着的对象往一端移动,移动完成后,移动完成后,直接清除掉边界的内存。

Mark-Sweep和Mark-Compact这两种策略是递进关系,但是在V8中两者是结合使用的。

垃圾回收造成的停顿

垃圾回收的这三种算法都需要将应用逻辑暂停下来,待执行完垃圾回收后再恢复执行应用逻辑。当v8的分代式垃圾回收中,新生代造成的停顿比老生代造成的停顿少的多。为了减少这种影响,引入了增量标记、延迟标记、增量式整理等。计划引入并行标记和并行处理。

V8对内存闲置的设置对于Chrome浏览器这种选项卡页面使用一个V8实例来说,内存的使用是绰绰有余的,而对Node编写的服务端来说,内存闲置也不影响正常场景下的使用。想要高性能的执行效率,注意让垃圾回收尽量少地进行。

以Web服务器中的会话实现为例,一般通过内存来存储,但在访问量大的时候会导致老生代中饭呢的存活对象剧增,不仅造成清理/整理过程费时,还会造成内存紧张,甚至溢出。

js垃圾回收也有另一种方法——引用计数法:可参考引用计数法和标记清除法

更多资料可以参考
并行标记

JS引擎V8的内存回收机制与内存限制(标记清除法)相关推荐

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

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

  2. Python 内存回收机制

    最近想了解一下Python的内存回收机制,特此来标记一下   平时在写代码的时候,关注的是写出能实现业务逻辑的代码,因为现在计算机的内存也比较宽裕,所以写程序的时候也就没怎么考虑垃圾回收这一方面的知识 ...

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

    浅谈V8引擎中的垃圾回收机制 这篇文章的所有内容均来自 朴灵的<深入浅出Node.js>及A tour of V8:Garbage Collection,后者还有中文翻译版V8 之旅: 垃 ...

  4. JS高级-自执行函数-垃圾回收机制及内存管理

    自执行函数 函数分为两种: (1)一般函数 预解析后通过函数调用 函数名( ) 执行 (2)自执行函数 js引擎一遇到整个函数就立马执行 代码如下: js中的垃圾回收机制及内存管理 内存管理 (1)全 ...

  5. js垃圾回收机制,内存泄露和内存溢出,解决闭包产生的内存泄露详解

    一.内存的周期和回收机制 分配内存----->使用内存----->释放内存 1.JS 环境中分配的内存有如下声明周期: 内存分配:当我们声明变量.函数.对象的时候,系统会自动为他们分配内存 ...

  6. Node的垃圾回收机制与内存溢出捕获(上)

    Node的垃圾回收机制与内存溢出捕获 一.什么是Node的内存?   想必大家在用JavaScript开发的过程中,不太关心内存的管理,因为对于前端来说,浏览器的内存几乎不会出现用完的情况,因为所接触 ...

  7. cocos2d-x初探学习笔记(13)--内存回收机制

    小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 之前提到过cocos2d-x的内存回收机制,但 ...

  8. Java技术专题之JVM逻辑内存回收机制研究图解版

    一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...

  9. python 释放变量所指向的内存_通俗易懂的Python垃圾回收机制及内存管理

    Python垃圾回收机制及内存管理 内存管理: 先定义一个变量 name='wxl' 那么python会在内存中开辟一小块区域存放"wxl",此时变量的值是我们真正想要存储的,wx ...

最新文章

  1. 【建站系列教程】3.1、cookie介绍
  2. Tomcat - 源码构建Tomcat 8.5.55 启动
  3. [optee]-optee的加解密接口的介绍
  4. html rotate()函数,CSS rotate()用法及代码示例
  5. JVM GC一篇通 - 基础与调优
  6. 完了!Oracle 被虐!MySQL 登顶 Top1!原来这么多人都在用
  7. 长距离大口径输水PCCP管道泄漏监测系统解决方案
  8. esp8266 蓝牙耳机_基于ON Semi LC823450XD 的蓝牙耳机解决方案
  9. CHROME插件开发之·web页面与插件后台通信(chrome.runtime.sendMessage => chrome.runtime.onMessageExternal.addListener)
  10. “IndentationError: unindent does not match any outer indentation level“ 错误解决
  11. 由内而外全面进化,影像娱乐都出彩,vivo S12 Pro上手
  12. 软件工程师为什么单身的六宗罪
  13. 《Data Algorithm》读书笔记七 — 购物篮分析
  14. 为什么IT行业工作那么火爆,仍然人才短缺
  15. Mac中的文件如何拷贝到硬盘中?
  16. 32岁了学python来的及吗_你要悄悄的学Python,然后惊艳所有人,后来都学的怎么样呢?...
  17. LibreCAD for windows 编译
  18. 随心,随性,随缘。注定让一生改变的,只在百年后,那一朵花开的时间…
  19. 从0开始学c语言-总结01-c语言的粗略认识和快捷键
  20. kali Linux单用户模式的退出方法

热门文章

  1. Go:包管理工具GOPATH、vendor、dep 、go module
  2. nargin与varargin的用法
  3. OPNET入门2-Basic Process
  4. The Battle of Chibi---赤壁之战(DP+数据结构(树状数组))
  5. Excel提示“此工作簿包含一个或多个无法更新的链接”怎么办
  6. explain的使用及详解
  7. 计算机组成及linux基础
  8. 天梯赛省赛选拔赛复盘
  9. 在html中如何使div在页面中居中显示
  10. 记一次Process finished with exit code 1 项目异常