Nodejs-内存控制(垃圾回收机制)(新生代老生代)(Scavenge算法)

内存控制

v8的垃圾回收机制和内存限制

对于性能敏感的服务器端程序,内存管理的好坏,垃圾回收状态的优良成都,都会对服务器造成影响

Node和V8

Node在JavaScript的执行上受益于v8,随着v8的升级享受到更好的性能和性的语言特征。

V8的内存限制

node无法直接操作大内存对象。在单个node进程情况下,计算机的内存资源无法得到充足的使用
造成这个问题的原因:node基于v8构建,所以node中使用的JavaScript对象都是通过v8自己的方式来分配和管理的。但是限制了开发者使用大内存的想法

V8的对象分配

在JavaScript中,对象是通过堆来进行分配的。node提供了v8中内存使用量查看的方式

$node
> process.memoryUsage()

在上述代码中,memoryUsage()方法的返回属性中。heapTotalheapUsed是v8的堆内存使用情况,前者是已经申请到的堆内存,后者是当前使用的量
在这里插入图片描述

v8限制堆大小的原因

  1. v8为浏览器设计,不太可能遇到大量使用内存的场景。对于页面来说,v8的限制已经搓搓有余。
  2. v8垃圾回收机制的限制。v8做一次小的垃圾回收需要50ms以上。做一次非增量式的垃圾回收需要1s以上,这是垃圾回收中引起JavaScript线程暂停执行的时间。在这样的时间花销下,应用的性能和响应都会下降。

V8的垃圾回收机制

v8的垃圾回收算法
v8的垃圾回收策略主要是基于分代式垃圾回收机制。`垃圾回收算法按照对象的存活时间将内存中的垃圾回收进行不同的分代,然后分代对于不同的分代的内存施以更加高效的算法`
v8的内存分代

将内存分为新生代和老生代。新生代的对象为存活时间较短的对象,老生代的对象为存活时间较长或者常驻的对象。
在这里插入图片描述

V8堆的整体大小就是新生代所用的内存空间加上老生代的内存空间。--max-old-space-size可以用来设置老生代的内存空间的大小。--max-new-space-size可以设置新生代内存空间的大小。这两个值在启动的时候就需要指定,v8使用的内存没有办法根据情况自动扩充。对于新生代内存,有两个reserved_semispace_size_所构成。机器位数不同,reserved_semispace_size在64位系统和32系统上分别为16mb和8mb。 v8堆内存的最大保留空间。4 * reserved_semispace_size + max_old_generation_size_v8在64位系统下能使用1.4gb,在32位系统下使用0.7gb

Scavenge算法

在分代的基础上,新生代的对象使用scavenge算法进行垃圾回收。在Scavenge的实现中,使用了Cheney算法。是典型的牺牲空间换取时间的算法。所以无法大规模的应用到所有垃圾回收中。可以使用在新生代中,新生代中的对象的生命周期比较短,适合这个算法

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

在这里插入图片描述

当一个对象经过多次复制还存活的时候,会被认为是生命周期比较长的对象,这种比较长的生命周期随后会被移动到老生代中,采用新的算法进行管理。对象从新生代移动到老生代称为晋升
在单纯的Scavenge过程中,From空间中的存活对象会复制到to空间中,然后from空间和to空间进行角色互换,但是在分代垃圾回收的前提下,from空间的存活对象在复制到to空间前要进行一系列的检查,在一定条件下,需要将存活周期长的对象移动到老生代中,也就是完成对象晋升。
对象晋升的条件 => 1. 对象是否经过scavenge回收 2. to空间的内存占用比超过限制

v8的对象分配集中在from空间中,对象从from空间中复制to空间的时候,会检查他在内存地址中来判断这个对象是否已经经历过一个scavenge回收,如果已经经历过,会将该对象从from空间复制到老生代空间中,如果没有就复制到to空间
另一个判断是to空间的内存占用比,当要从from空间复制一个对象到to空间中,如果to空间的内存使用超过了25%,这个对象会被直接晋升到老生代中
设置25%这个限制值的原因是当这次scavenge回收完成之后,这个to空间将变成from空间,接下来的内存分配在这个空间中进行,如果占比过高,就会影响后续的内存分配。

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Mark-Sweep & Mark-Compact

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/594449.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解基于 RAG 的 txt2sql 全过程

前文 本文使用通义千问大模型和 ChromaDB 向量数据库来实现一个完整的 text2sql 的项目,并基于实际的业务进行效果的展示。 准备 在进行项目之前需要准备下面主要的内容: python 环境通义千问 qwen-max 模型的 api-keyChromaDB 向量数据库acge_text_…

一款 NodeJS 版本管理工具 NVM (Windows)

一、简介 Node Version Manager(NVM)是一种用于管理多个 NodeJS 版本的工具。在日常工作中,我们可能同时在进行多个不同的项目开发,每个项目的需求不同,依赖与不同版本的NodeJS 运行环境。这种情况下,维护…

数据处理学习笔记9

一些其他的函数 “Resize”和“Reshape”的区别主要在于它们对数组元素数量和形状的处理方式不同,以下是详细介绍: “Resize”通常会改变数组的元素数量,在放大数组形状时会用0补全新增的元素,而在缩小数组形状时会丢弃多余的元素…

一款AI工作流项目:phidatahq/phidata

一款AI工作流项目:phidatahq/phidata 构建和测试功能强大的 AI 工作流程。该项目提供了一个工作流平台,可以结合大型语言模型(LLM)和各种工具,扩展模型的实用性和应用范围。[1][4][5] 开发各种 AI 助手应用,如客服聊天机器人、数据分析工具、研究助手等。phidata 提…

Golang | Leetcode Golang题解之第72题编辑距离

题目&#xff1a; 题解&#xff1a; func minDistance(word1 string, word2 string) int {m, n : len(word1), len(word2)dp : make([][]int, m1)for i : range dp {dp[i] make([]int, n1)}for i : 0; i < m1; i {dp[i][0] i // word1[i] 变成 word2[0], 删掉 word1[i], …

LabVIEW波浪发电平台浮筒取能效率数据采集系统

LabVIEW波浪发电平台浮筒取能效率数据采集系统 随着化石能源的逐渐减少以及能源价格的上升&#xff0c;寻找可替代的、可再生的、清洁的能源成为了世界各国的共识。波浪能作为一种重要的海洋能源&#xff0c;因其巨大的潜力和清洁性&#xff0c;近年来受到了广泛关注。开发了一…

32 OpenCV Harris角点检测

文章目录 cornerHarris 算子示例 角点检测 cornerHarris 算子 void cv::cornerHarris ( InputArray src,OutputArray dst,int blockSize,int ksize,double K,int borderType BORDER_DEFAULT) src:待检测Harris角点的输入图像&#xff0c;图像必须是CV 8U或者CV 32F的单通道…

玩comfyui踩过的坑之使用ComfyUI_Custom_NODES_ALEKPET翻译组件问题

环境&#xff1a; 秋叶安装包&#xff0c;安装ComfyUI_Custom_NODES_ALEKPET组件或者直接下载网盘中的包&#xff0c;直接解压包到comfyui根目录/custom_nodes/&#xff0c;重启后&#xff0c;按指导文件操作。 注意&#xff1a;网盘指导包中有配置好的流程json文件&#xff0…

【源码】 频裂变加群推广强制分享引流源码

视频裂变加群推广强制分享引流源码&#xff0c;用户达到观看次数后需要分享给好友或者群,好友必须点击推广链接后才会增加观看次数。 引导用户转发QV分享,达到快速裂变引流的效果&#xff01; 视频裂变推广程序&#xff0c;强制分享链接&#xff0c;引导用户转发&#xff0c;…

prometheus搭建

1.prometheus下载 下载地址:Download | Prometheus 请下载LTS稳定版本 本次prometheus搭建使用prometheus-2.37.1.linux-amd64.tar.gz版本 2.上传prometheus-2.37.1.linux-amd64.tar.gz至服务器/opt目录 CentOS7.9 使用命令rz -byE上传 3.解压缩prometheus-2.37.1.linux…

VscodeC/C++环境配置

引言 vscode是一款非常好用的编辑器&#xff0c;集成了大量的插件&#xff0c;具有很高的自由度&#xff0c;因此广受大家的喜爱。但是他本身是不带编译器的&#xff0c;因此如果要使用vscode来编译C/C程序的话&#xff0c;我们需要额外安装编译器并且为vscode配上环境。 编译…

Docker 入门与实践:从零开始构建容器化应用环境

Docker 一、docker常用命令docker ps 格式化输出Linux设置命令别名 二、数据卷相关命令挂载到默认目录&#xff08;/var/lib/docker&#xff09;挂载到本地目录 三、自定义镜像Dockerfile构建镜像的命令 四、网络自定义网络 五、DockerCompose相关命令 一、docker常用命令 dock…

Python | Leetcode Python题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:names path.split("/")stack list()for name in names:if name "..":if stack:stack.pop()elif name and name ! ".":stack.append(name)re…

ThreeJS:光线投射与3D场景交互

光线投射Raycaster 光线投射详细介绍可参考&#xff1a;https://en.wikipedia.org/wiki/Ray_casting&#xff0c; ThreeJS中&#xff0c;提供了Raycaster类&#xff0c;用于进行鼠标拾取&#xff0c;即&#xff1a;当三维场景中鼠标移动时&#xff0c;利用光线投射&#xff0c;…

点亮一个LED

新建项目 #include <REGX52.H>void main() {P2 0xFE;while(1){} }调整字体大小 在编译之前要勾选一个东西,不然scp读取不了 去stc-isp中烧录进51单片机 两个地方要勾选,一个是单片机型号,一个是串口号,我的单片机型号不是江科大视频里面那个型号,所以不能按视频里面来选…

【数据结构(邓俊辉)学习笔记】列表04——排序器

文章目录 0. 统一入口1. 选择排序1.1 构思1.2 实例1.3 实现1.4 复杂度 2. 插入排序2.1 构思2.2 实例2.3 实现2.4 复杂度分析2.5 性能分析 3. 归并排序3.1 二路归并算法3.1.1 二路归并算法原理3.1.2 二路归并算法实现3.1.3 归并时间 3.2 分治策略3.2.1 实现3.2.2 排序时间 4. 总…

学习笔记:【QC】Android Q - IMS 模块

一、IMS init 流程图 二、IMS turnon 流程图 三、分析说明 1、nv702870 不创建ims apn pdp 2、nv702811 nv702811的时候才创建ims pdp&#xff1a; ims pdp 由ims库发起&#xff0c;高通没有开放这部分代码&#xff1a; 10-10 11:45:53.027 943 943 E Diag_Lib: [IMS_D…

只用语音能训练出AI大模型吗?就像训练会说话但不识字的人一样

AI语音对话技术通常是基于语音识别和自然语言处理&#xff08;NLP&#xff09;的。在这个过程中&#xff0c;语音首先被识别成文字&#xff0c;然后NLP技术对这些文字进行处理&#xff0c;生成回应。然而&#xff0c;我们是否可以直接训练一个“文盲”大模型&#xff0c;即只用…

45. UE5 RPG 增加角色受击反馈

在前面的文章中&#xff0c;我们实现了对敌人的属性的初始化&#xff0c;现在敌人也拥有的自己的属性值&#xff0c;技能击中敌人后&#xff0c;也能够实现血量的减少。 现在还需要的就是在技能击中敌人后&#xff0c;需要敌人进行一些击中反馈&#xff0c;比如敌人被技能击中后…

深度学习中的注意力机制二(Pytorch 16)

一 Bahdanau 注意力 通过设计一个 基于两个循环神经网络的编码器‐解码器架构&#xff0c;用于序列到序列学习。具体来说&#xff0c;循环神经网络编码器将长度可变的序列转换为固定形状的上下文变量&#xff0c;然后循环神经网络 解码器根据生成的词元和上下文变量按词元生成…