关于Node.js中内存管理的思考与实践

本文探讨Node.js中内存管理,重点分析V8的垃圾回收机制、内存限制以及堆内外存的使用,揭示内存泄漏的原因和影响,并提供内存使用观察的方法。
摘要由CSDN通过智能技术生成

本人最近非常痴迷于Node的探索,也对Node用于后端开发感兴趣。所以本着探索的精神,认真重读了一下《深入浅出Node.js》关于内存的部分,觉得自己其实开始不会去关心了解这些内容,现在真的开阔我的眼界,受益匪浅。

欢迎大家关注我的公众号《前端小时》,文章同步发送!

在这里插入图片描述

01 前言

随着Node的发展,JavaScript的运行已经不再局限于运行在浏览器中了,Node在服务端的应用使得越来越多的问题也显现出来。对于刚接触JavaScript的开发者来说,基本上很少会想到内存分配或者内存泄露的问题,为了跟上潮流,就讲解一下Node是如何合理高效地使用内存,防止内存泄漏。

02 V8垃圾回收与内存限制

JavaScript编程不用关心内存的分配和释放的问题,因为它有垃圾回收机制来管理。但是我们对于内存管理更深一步的了解可谓是很少,到底内存是怎么分配的、垃圾回收是怎么运行的?

01 Node与V8

我们先来了解一下这两者是什么关系。首先V8是谷歌开发出来的浏览器引擎,性能可谓是十分优异,使得JavaScript编写服务器程序成为可能。V8的由来是虚拟机专家Lars Bak开发出来的,开发者之前的工作一直都是专注于高性能的虚拟机开发。

Node是一个构建在Chrome的JavaScript运行时平台,由此一来,Node的高性能就如同抱住了V8的大腿,可以随着V8的升级而享受更好的性能。

02 V8的内存限制

Node通过JavaScript使用内存的话会有限制,而且Node无法直接操作大内存对象。64位系统下约为1.4GB,而32位系统下约为0.7GB。原因是Node基于V8构建,它的内存分配和管理都是由V8来控制,虽然在浏览器下这种分配机制没有问题,但是在Node中却是有问题的。

03 V8的对象分配

在V8中,所有的JavaScript对象都是通过堆来分配的,对象占用的内存空间大小是不确定的。
在这里插入图片描述

当我们在代码里写上一些变量的时候,我们就会向堆中的内存空间进行申请。我们上面说过V8是有内存分配限制的,这是因为V8的垃圾回收机制影响。我们试想一下假如有1.5GB的垃圾需要等待回收,而V8的垃圾回收机制运行一次需要每50毫秒以上,在这段时间内,程序会无法运行。

假如说我非要打开这个限制也不是不行,我们可以在Node的启动时候更改一下参数即可:

node --max-old-space-size=1700   xxx.js    //单位是MB
node --max-new-space-size=1024  xxx.js    //单位是KB

上面代码的意思就是新生代和老生代空间的更改,稍后解析什么是新生代和老生代空间。

04 V8垃圾回收机制

在V8中,我们知道内存空间可以分为新生代和老生代。新生代空间主要是保存一些存活时间较短的对象,而老生代空间主要存储一些存活时间较长的对象。

之前说过64位系统只能使用约1.4GB,32位只能使用0.7GB的空间。这空间是包含新生代和老生代空间,且老生代的空间比新生代要多。
在这里插入图片描述

32位 64位
新生代 16MB 32MB
老生代 700MB 1400MB

V8主要采用两种不同的算法,分别作用于新生代和老生代,因为两者的关系不一样。主要有类算法,第一是Scavenge算法,第二是Mark-Sweep & Mark-Compact。新老生代的特点如下:

新生代:存活对象较少

老生代:存活对象较多

①Scavenge算法

  • 把新生代空间一分为二,为From空间和To空间
  • 内存先分配到From空间,垃圾回收会检查From空间存活情况
  • 把From空间的存活对象移到To空间,释放From空间
  • 把From和To空间对换

这就完成了垃圾回收的一次清理过程。
在这里插入图片描述

②Mark-Sweep算法

  • 遍历堆中的所有对象,标记存活的对象
  • 清除没有被标记的对象
    在这里插入图片描述

由于老生代空间中,存活的对象较多,使用 Scavenge 算法的话遍历的时间会相对来说

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值