Nodejs内存管[Mark-Sweep算法][Mark-Compact]

news2024/9/24 7:24:12

内存控制

Mark-Sweep & Mark-Compact

对于老生代的对象,存活对象占较大的比重,采用scvenge方法会存在如下问题

1. 存活对象较多,复制存活对象的效率很低
2. 浪费一半空间的问题

因此v8在老生代中主要采用了Mark-Sweep和Mark-Compact相结合的方式进行垃圾回收
Mark-Sweep不将内存空间划分为两半,不存在浪费一半空间的行为。Mark-Sweep在标记阶段遍历堆中的所有对象,标记活着的对象,在随后的清除阶段,只清除没有标记的对象。对比Scanvenge.Scavenge中只复制活着的对象,而Mark-Sweep只清理死亡的对象。活对象在新生代中只占较小的部分,死对象在老生代中只占较小的部分。
Mark-Sweep最大的问题是在进行一次标记清楚回收之后,内存空间会出现不连续的状态。这种内存碎片会对后续的内存分配造成问题。
Mark-Compact是标记整理,在Mark-Sweep之后演变回来的。差别在于对象在标记为死亡之后,在整理的过程中,将获得对象往一侧移动,移动完成hi后,直接清理掉边界外的内存。
在这里插入图片描述

在这里插入图片描述

全暂停停顿和增量标记

为了避免出现JavaScript应用程序和垃圾回收器不一致的情况,垃圾回收的三种基本算法都需要将应用程序暂停下来,等待执行完垃圾回收之后,在恢复应用逻辑,这种行为被称为全暂停停顿
为了降低全堆垃圾回收带来的停顿时间,v8在2011年引入了增量标记的算法。增量标记将垃圾回收的执行过程分为多个小阶段,在每个小阶段中,垃圾回收器只标记一部分存活的对象,然后将标记的结果进行合并,最后一次性将存活的对象复制到新的内存空间中。
javascript还引入了延迟清理增量式整理
在这里插入图片描述

以上三种算法的对比

在这里插入图片描述

在v8的垃圾回收过程中,会输出一些日志信息,可以通过`--trace-gc`来开启垃圾回收日志的输出。
$node --trace-gc

高效使用内存

在v8面前,开发者需要让垃圾回收机制更高效的工作

作用域

在JavaScript中,能形成作用域的有函数调用,with以及全局作用域

var foo = function() {
    val local = {}
}

在函数调用的时候会形成响应的作用域,函数执行完成之后,作用域会销毁。函数作用域中声明的局部变量分配在该作用域上,随着作用域的销毁而销毁。在这个实例中,对象非常小,会被分配在新生代中的from空间中,在作用域释放之后,局部变量失效,引用的对象会在下次垃圾回收的时候被释放

标识符查找
var bar = function () {
    console.log(local)
}

javascript在执行时候回去查找变量定义。先查找当前作用域,如果在当前作用域中没有办法找到该变量的声明,就会像上级作用域中去找。直到找到为止。

作用域链
var foo = function() {
    var local = 'local var'
    var bar = function() {
        var local = 'another var'
        var baz =function () { 
            console.log(local)
        }
    baz()
    }
bar()
}
foo()

在这里插入图片描述

变量的主动释放

如果变量是全局变量,由于全局作用域需要直到进程退出才能释放,此时导致引用的对象常驻内存,如果需要释放常驻内存的对象,可以通过delete操作来删除引用关系,将变量重新赋值,将旧的对象脱离关系。

gloval.foo = "I am global object"
console.log(global.foo)
delete global.foo // 
global.foo = undefined
console.log(global.foo) // undefined

闭包

闭包是JavaScript的高级特性,利用他可以产生很多巧妙的效果,问题在于,一旦有变量引用则个中间函数,这个中间函数不会发生释放,同时也会使得原始的作用域不会得到释放。作用域中产生的内存占用也不会得到释放

小结

在JavaScript执行中,无法立即回收的内存有闭包和全局变量引用情况。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

西门子数控网络IP设定配置

总结:menuselect-诊断-屏幕下方右翻页找到tcp/ip,进去选择tcp/ip诊断,进去选择x130网口,点击更改, 如果没有更改,menuselect-调试-口令,输入口令 sunrise 然后重新配置tcp/ip,配置完…

Unity3D DOTween

简单介绍一下 DOTween 插件的使用。 导入插件 先到 Asset Store 获取 DOTween 插件,然后在 Package Manager 的 My Assets 中搜索,下载并导入插件。 导入后,会自动弹出一个窗口,提示需要先对插件进行配置。 点击上图中的按钮&am…

navicat premium16.3.9重置

软件下载 官网地址:https://navicat.com.cn/products/ # 准备脚本 1、建一个txt 2、复制以下代码 3、修改文件格式为bat 4、运行bat文件 5、重新打开navicat,试用期重置为14 经测试16.2.3以上版本均可用 echo off set dnInfo set dn2ShellFolder set r…

迅饶科技 X2Modbus 网关 AddUser 任意用户添加漏洞复现

0x01 产品简介 X2Modbus是上海迅饶自动化科技有限公司Q开发的一款功能很强大的协议转换网关, 这里的X代表各家不同的通信协议, 2是T0的谐音表示转换, Modbus就是最终支持的标准协议是Modbus协议。用户可以根据现场设备的通信协议进行配置,转成标准的Modbus协议。在PC端仿真…

从零开始学AI绘画,万字Stable Diffusion终极教程(六)

【第6期】知识补充 欢迎来到SD的终极教程,这是我们的第六节课,也是最后一节课 这套课程分为六节课,会系统性的介绍sd的全部功能,让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 …

三维变换矩阵实战——三维点云的旋转、缩放、镜像、错切、平移、正交投影

一、旋转矩阵(右手坐标系) 绕x轴旋转 旋转矩阵:右边矩阵是点云的原始坐标,左边的是旋转矩阵 可视化:绕x轴旋转90度 代码: import vtk import numpy as np import mathdef pointPolydataCreate(pointClou…

毕业设计:《基于 Prometheus 和 ELK 的基础平台监控系统设计与实现》

前言 《基于 Prometheus 和 ELK 的基础平台监控系统设计与实现》,这是我在本科阶段的毕业设计,通过引入 Prometheus 和 ELK 架构实现企业对指标与日志的全方位监控。并且基于云原生,使用容器化持续集成部署的开发方式,通过 Sprin…

Eayswoole 报错 crontab info is abnormal

在执行一个指定的定时任务时 如 php easyswoole crontab show 报错 crontab info is abnormal 如下图所示: 查询了半天 修改了如下配置: 旧的 // 创建定时任务实例 $crontab new \EasySwoole\Crontab\Crontab($crontabConfig); 修改后&#…

PHP源码_众筹商城

众筹商城源码 众筹商品平台 商城加共识元富之路 网上商城众筹 前端是编译后的,后端PHP,带商城 运行截图 源码贡献 https://githubs.xyz/boot?app39 部分数据库表 CREATE TABLE ti_shopro_store (id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,nam…

微信小程序生成二维码加密(CryptoJS4.0加密PHP8.0解密)AES方式加密

1、小程序创建 crypto-js.js和crypto.js两个文件(点击文件即可) 2、小程序js页面引入 var crypto require(../../utils/crypto.js);//注意路径是否正确3、使用 let data {id: that.data.id,name: dx}console.log(JSON.stringify(data))console.log(&…

信创国产化的基础知识

信创&国产化的基础知识 核心技术是国之重器,核心技术受制于人是我们最大的隐患。 实践反复告诉我们,关键核心技术是要不来、买不来、讨不来的。 要打好科技仪器设备、操作系统和基础软件国产化攻坚战,鼓励科研机构、高校同企业开展联合攻…

深度学习之GAN网络

目录 关于GAN网络 关于生成模型和判别模型 GAN网路的特性和搭建步骤(以手写字体识别数据集为例) 搭建步骤 特性 GAN的目标函数(损失函数) 目标函数原理 torch.nn.BCELoss(实际应用的损失函数) 代码…

延时任务通知服务的设计及实现(一)-- 设计方案

一、背景 在日常编程中,总是会遇到延时执行的任务。比如:定期发送邮件,定时上架商品;再比如订单在一定时间内未支付,需要到期关闭订单。 你也许会借助分布式任务xxl-job来实现,不仅性能差,cro…

Web安全研究(九)

知识星球 首先推荐一下我们的知识星球,以AI与安全结合作为主题,包括AI在安全上的应用和AI本身的安全; 加入星球你将获得: 【Ai4sec】:以数据驱动增强安全水位,涵盖内容包括:恶意软件分析,软件安全,AI安全,数据安全,系统安全,流量分析,防爬,验证码等安全方向。…

GStreamer日志调试笔记

1、查询所有分类 #gst-launch-1.0 --gst-debug-help 2、查询videotestsrc的日志 #gst-launch-1.0 --gst-debug-help | findstr videotestsrc 结果: 3、使用--gst-debug设置相应日志类型的相应等级,越大显示日志越多,排查内存泄露可以设置为9 …

一对一WebRTC视频通话系列(四)——offer、answer、candidate信令实现

本篇博客主要讲解offer、answer、candidate信令实现,涵盖了媒体协商和网络协商相关实现。 本系列博客主要记录一对一WebRTC视频通话实现过程中的一些重点,代码全部进行了注释,便于理解WebRTC整体实现。 一对一WebRTC视频通话系列往期博客 一…

图像处理

图像处理 导入图片 导入io模块,读取文件所在位置,将生成的图像数据赋给变量img,显示图像 from skimage import ioimgio.imread(D:\工坊\图像处理\十个勤天2.png)io.imshow(img) 运行结果: 将图片进行灰度处理 from skimage i…

透明屏幕的透明度如何?能否实现真正的透明效果?

透明屏幕的透明度是一个关键的特性,其实际表现会因技术、材料和设计等因素而有所不同。目前,透明屏幕技术已经取得了显著的进步,尤其是在OLED(有机发光二极管)领域。 OLED透明屏幕由于其自发光的技术优势,能…

如何修改图片大小?调整图片大小的几个方法介绍

当我们在不同的应用场景中使用图片的时候,常常会需要去调整图片尺寸来适应不同的要求,还有图片体积大小也会有要求,这时候就需要用到我们今天分享的这款图片在线处理工具了,不管是图片改大小或者图片压缩它都能快速解决&#xff0…

Hadamard Product(点乘)、Matmul Product(矩阵相乘)和Concat Operation(拼接操作)在神经网络中的应用

Hadamard乘积(Hadamard Product),矩阵乘法(Matmul Product)和拼接操作(Concatenation Operation)在神经网络中的使用情况如下: Hadamard Product点乘、内积: Hadamard乘…