首页 > 系统相关 >Node系列 — v8引擎堆内存详解

Node系列 — v8引擎堆内存详解

时间:2023-10-12 19:13:51浏览次数:40  
标签:Node js 详解 内存 v8 GB size

参考:https://juejin.cn/post/6963170647207837710

v8 的堆内存限制

Node 程序中 javascript 的使用内存是有限制的,注意这个内存是指堆内存,在v8中,所有的 js 对象都存在堆中。在实际应用中不小心触碰到这个边界,进程就会退出。64位系统下为1.4GB,32位系统下为0.7GB。 Node 是基于 v8 引擎构建,所以 v8 会通过自己的方式来进行内存的分配和管理。 那么问题来了:

  • 为什么要对 v8 堆内存进行限制?
  • 为什么内存的大小控制在 1.4GB or 0.7GB ?

v8 的对象分配

内存查询

Node 提供了 process.memoryUsage() 方法,返回描述 Node.js 进程的内存使用情况(以字节 Bytes 为单位)的对象。 执行以下代码可以查看内存的使用情况:

$ node
> process.memoryUsage()
{
  rss: 29196288,
  heapTotal: 5685248,
  heapUsed: 4549120,
  external: 926086,
  arrayBuffers: 10077
}

解释一下这些字段:

      rss: 常驻集大小, 是为进程分配的物理内存(总分配内存的子集)的大小,包括所有的 C++ 和 JavaScript 对象与代码。

      heapTotal: v8 已申请的堆内存大小。

      heapUsed: 当前堆内存已使用的大小。

      external: 代表 V8 管理的绑定到 Javascript 对象的 C++ 对象的内存使用情况。

      arrayBuffers: 代表分配给 ArrayBuffer 和 SharedArrayBuffer 的内存,包括所有的 Node.js Buffer。

 

重点:在实际业务中,我们声明的每一个变量对象都被分配在堆中,如果已申请的堆中空闲内存不够分配新的对象,将继续申请堆内存,直到超出 v8 的限制。  

内存上限默认值

在《深入浅出Nodejs》中说明,64位系统约为1.4GB,32位系统约为0.7GB。
我根据本地几个 node 版本亲自测试了一下: 创建 memorySize.js:

const v8 = require('v8')
console.log('HeapStatistics:',v8.getHeapStatistics()) // 查询堆内存上限设置

结果:

HeapStatistics: {
  total_heap_size: 4284416,
  total_heap_size_executable: 524288,
  total_physical_size: 3122176,
  total_available_size: 4342823264,
  used_heap_size: 3384776,
  heap_size_limit: 4345298944, // 4.04G
  malloced_memory: 254120,
  peak_malloced_memory: 90736,
  does_zap_garbage: 0,
  number_of_native_contexts: 1,
  number_of_detached_contexts: 0
}

修改堆内存默认值

 

     

标签:Node,js,详解,内存,v8,GB,size
From: https://www.cnblogs.com/wfblog/p/17760283.html

相关文章

  • [node]安装node后,可以在控制台进行简单的js文件测试
    1.在Windows操作系统安装好node之后,可以在任意文件地址,按下shift+鼠标右键,打开WindowsPowerShell。  或者在VSCode中,右键选择某文件夹,选择“在集成终端中打开”。2.输入node,可以查看安装好的node版本。3.按下ctrl+d,退出node。 在js文件所在目录打开终......
  • Oracle数据库导入、导出详解
    Oracle11g数据库导入导出方式传统方式【exp(导出)和(imp)导入】数据泵方式【expdp导出和(impdp)导入】第三方工具【PL/sqlDevelpoer】一、什么是数据库导入导出?Oracle11g数据库的导入/导出,就是我们通常所说的Oracle数据的还原/备份。 数据库导入:把.dmp格式文件从本地导入到......
  • Python 列表详解:从基础到进阶
    Python是一种广泛使用的高级编程语言,它的设计强调代码的可读性和简洁的语法。Python支持多种编程范式,包括过程、面向对象和函数式编程。在Python中,列表是一种非常重要的数据类型,它可以包含各种类型的元素,如数字、字符串和其他列表。本文将详细介绍Python列表的基础和进阶用法。【基......
  • 第四节:Redis数据持久化机制(备份恢复)、缓存淘汰策略、主从同步原理、常见规范与优化
    一.数据持久化 1. 含义Redis提供了RDB和AOF两种持久化方式,默认开启的是RDB,如果需要AOF,需要手动修改配置文件进行开启。RDB:是一种对Redis存在内存中的数据周期性的持久化机制,将内存中的数据以快照的形式硬盘,实质上是fork了一个子进程在执行数据存储,采用的是二进制压......
  • 开课吧前端1期.阶段3-1:软件的使用 (bower,atom, node)
    今天主要不讲课,试试环境软件:(推荐,有自己熟悉的用自己的)1.编辑器:atom支持插件: atom-typescript language-vue language-weex markdown-preview-plus2.服务器:wamp(apache+mysql)、xampp、nginx web服务器(要能支持php)——Apache 数据库——MySQL3.Phot......
  • 软件测试|Linux三剑客之sed命令详解
    简介sed(StreamEditor)是一款流式文本编辑器,在Linux和类Unix系统中广泛使用。它的设计目的是用于对文本进行处理和转换,可以用于替换、删除、插入、打印等操作。sed命令通过逐行处理文本,允许您使用简单的命令来编辑大量文本数据。本文将详细介绍sed命令的基本用法和一些常......
  • 软件测试|Linux三剑客之grep命令详解
    简介grep是一款在Linux和类Unix系统中广泛使用的文本搜索工具。它的名字来源于GlobalRegularExpressionPrint(全局正则表达式打印),它的主要功能是根据指定的模式(正则表达式)在文本文件中搜索并打印匹配的行。grep非常强大且灵活,可以用于日志分析、文件过滤、代码搜索等多......
  • 软件测试|Linux三剑客之awk命令详解
    简介awk是一种强大的文本处理工具,在Unix和类Unix系统中广泛使用。它允许您在文本文件中进行复杂的数据处理和格式化输出。awk的名字是根据它的三位创始人Aho、Weinberger和Kernighan姓氏的首字母命名的。本文将详细介绍awk命令的基本用法和一些常见的用例。awk基本语......
  • YOLOv8+DeepSORT多目标车辆跟踪(车辆检测+跟踪+车辆计数)(内附免费资源+部署讲解)
    https://blog.csdn.net/Little_Carter/article/details/133610076目录一、前言二、开发环境(前提条件)三、环境搭建教程3.1、创建虚拟环境3.2、选择虚拟环境并安装所需要的包3.3、运行代码步骤3.3.1、克隆git储存库3.3.2、转到克隆库的文件夹下3.3.3、安装依赖项3.3.4......
  • ERROR in node_modules/rxjs/dist/types/internal/operators/combineLatest.d.ts(3,61
    原文链接:https://www.longkui.site/error/error-in-node_modules-rxjs/4839/angular项目,启动的时候报错。详细的报错如下:这个报错的原因比较简单,rxjs的版本不对,我用的是angular7可能和rxjs版本不匹配。解法方法也很简单,主要是降版本,我们找到项目的package.json把rxjs版本改成......