在这里输入图片标题

1 V8的垃圾回收机制与内存限制

JavaScript与Java一样,由垃圾回收机制来进行自动的内存管理。对于性能敏感的服务器端程序,内存管理的好坏、垃圾回收状况是否优良,都会对服务构成影响。而在Node中,这一切与V8引擎息息相关。

1.2 V8的内存限制

Node中通过JavaScript只能使用部分内存(64位约1.4G,32位约0.7G)。V8对内存做了限制。因此这种限制下,将会导致Node无法直接操作大内存对象。

1.3 V8的对象分配

V8中,所有的JavaScript对象都是通过堆来分配的。

可以使用以下命令查看Node中V8内存的使用量。

> $ node
> process.memoryUsage();
{ rss: 25939968,heapTotal: 5767168,//已申请到的堆内存heapUsed: 4707312,//当前使用的量external: 8671 }
复制代码

至于rss为何物,我们会在下面介绍。

V8的堆示意图:

限制内存原因:

  • 首先V8是为浏览器而设计的;前期足以满足网页端的需求;
  • 深层原因是V8的垃圾回收机制,垃圾回收耗时,引起JavaScript线程暂停执行时间。
  • 可以手工调整内存大小
node --max-old-space-size=1700 test.js  //单位为MB。设置老生代node --max-new-space-size=1024 test.js //单位为KB。设置新生代
复制代码

1.4 V8的垃圾回收机制

主要的垃圾回收策略是基于分代式的垃圾回收机制:将对象的存活时间进行不同的分代

V8中,主要将内存分为新生代和老生代。新生代中的对象为存活时间较短的对象,老生代中的对象为存活时间较长或常驻内存的对象。

  • 前面讲到的命令是可以分别设置新生代和老生代的大小。

  • 新生代和老生代的最大值需要在启动时就指定,因此无法动态 扩展。手工设置新生代或老生代的内存,只能在启动时就指定,无法动态的扩展。

Scavenge算法

在分代的基础上,新生代中的对象主要通过Scavenge算法进行垃圾回收。Scavenge算法的具体实现中采用了Cheney算法。

  • Cheney算法主要使用了复制的方式实现。
  • 新生代堆内存被一分为二
  • From区存放处于使用状态对象
  • TO区为闲置空间
  • 分配对象时首先在From分配
  • 垃圾回收时,检查From空间中的存活对象,将这些对象复制到TO空间。非存活对象直接释放对应空间。
  • 垃圾回收实际上就是将对象在FROMTO两个空间之间复制。
  • 多次复制仍然存活的对象,即生命周期较长的对象,会被移动到老生代。
  • 对象从新生代到老生代的过程称为晋升
  • 对象晋升过程:

另一个判断条件是:TO空间使用是否超过25%。如果超过,直接移动到老生代。

设置25%这个值,是因为当Scavenge完成回收后,这个TO区将变成From区,后面的对象分配要在这个区中进行。如果占比过高,会影响后续的内存分配。

Scavenge的缺点是只能使用堆内存的一半。所以无法大规模的运用到所有的垃圾回收中。但是时间效率上有优异的表现。因此非常适合新生代的垃圾回收,因为新生代中的对象存活周期都较短。

Mark-Sweep & Mark-Compact算法

老生代中主要采用这两种算法进行垃圾回收。

因为老生代中的存活对象占比较大,因此使用Scavenge算法会有弊端:

  • 存活对象多,复制效率低;
  • 浪费一半空间;

1.Mark-Sweep:标记清除

分为标记、清除两个阶段;

  • 标记阶段会遍历堆中的所有对象,并只标记活着的对象;
  • 清除阶段只清除没有被标记的对象;
Mark-Sweep Scavenge
只清理死亡对象 只复制存活对象
死对象在老生代中比重小 活对象在新生代中比重小

Mark-Sweep的最大问题即是:在清理完后,内存会出现不连续的状态。导致后续对内存的分配可能出现问题,如无法分配一个大对象。

2.Mark-Compact:标记整理

为了解决Mark-Sweep的问题。Mark-Compact在标记对象死亡后,在整理过程中,将活着的对象往一端移动,移动完成后,直接清理掉边界外的内存。

算法比较

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

V8主要使用Mark-Compact,在空间不足以对从新生代中晋升过来的对象进行分配时才使用Mark-Sweep。

Nodejs内存控制详解(上篇)相关推荐

  1. 【C++】C++对象模型:对象内存布局详解(C#实例)

    C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...

  2. IOS视频编辑功能详解上篇-添加水印

    前言 用代码在简单视频编辑中,主要就是加美颜.水印(贴图).视频截取.视频拼接.音视频的处理,在美颜中,使用GPUImage即可实现多种滤镜.磨皮美颜的功能,并且可以脸部识别实时美颜等功能,这个有很多 ...

  3. jvm之java内存区域详解篇guide哥yyds

    jvm 一.java内存区域详解 1.运行时数据区域 线程私有的: 虚拟机栈 本地方法栈 程序计数器 线程共享的: 堆 方法区 直接内存(非程序运行时数据区的一部分) 1.1什么是程序计数器 程序计数 ...

  4. Java内存溢出详解之Tomcat配置

    Java内存溢出详解 转自:http://elf8848.iteye.com/blog/378805 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError ...

  5. Java内存溢出详解

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...

  6. 《转载》Tomcat内存设置详解

    原文地址:Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 ...

  7. Linux进程地址空间与进程内存布局详解,内核空间与用户空间

    Linux进程地址空间与进程内存布局详解 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据. 未初始化过的数据( ...

  8. spark on yarn 内存分配详解

    spark on yarn 内存分配详解

  9. 基于MIG控制器的DDR3读写控制详解

    基于MIG控制器的DDR3读写控制详解 目的:详细介绍FPGA中基于MIG IP核控制的DDR3详细控制及内部逻辑 平台:AX7350-Xilinx 软件:Vivado 2017.4 1.MIG IP ...

最新文章

  1. 灵活运用ISA的链接转换功能:ISA2006系列之十三
  2. 机器学习-数据科学库(第二天)
  3. 2021-03-20 GPS抽稀之道格拉斯-普克(Douglas-Peuker)算法
  4. Java黑皮书课后题第7章:7.14(计算gcd)编写方法,返回个数不确定的整数的最大公约数。编写一个测试程序,提示用户输入5个数字,调用该方法找出这些数的最大公约数,并显示这个最大公约数
  5. JavaXml教程(十)XML作为属性文件使用
  6. elisa标准曲线怎么做_如何合理绘制ELISA标准曲线要点
  7. Django权限系统auth模块详解
  8. java的lr词法编译器,自制编译器 青木峰郎 笔记 Ch3 词法分析的概要
  9. 英特尔it服务器芯片,intel服务器芯片组驱动程序
  10. hdu 6080 度度熊保护村庄(floydS使用技巧)
  11. C++对windows控制面板的操作
  12. Apple Watch更懂女人心
  13. STM32系列微控制器入门介绍
  14. 洛谷P5594-【XR-4】模拟赛
  15. Python如何做自动化测试?
  16. Soda Theme sublime 自定义编辑器主题
  17. ios 图标的配置
  18. 如何测试数字硅麦软件,硅麦克风技术规格及测试方法
  19. 网络编程学习(9)/ FTP项目(3) ——目录切换、目录查看功能
  20. arcgis二次开发动态追踪以及提高

热门文章

  1. Authentication for the REST APIs
  2. php 未实例化类调用方法的问题
  3. WindowsBatch与LinuxShell比较[变量符号和关键字]
  4. operator* operator- 操作符的使用
  5. AndroidStudio_使用NanoHTTPD搭建HTTP服务_把android设置当成一个http服务器来使用---Android原生开发工作笔记225
  6. Sharding-JDBC数据库_垂直切分_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记012
  7. C语言快速学习笔记001-相关语法
  8. python数据结构-图
  9. 2015年3月29号日报
  10. 跨多个交换机VLAN的配置方案设计(H3C)