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

内存控制

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.mzph.cn/pingmian/6946.shtml

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

相关文章

【跟马少平老师学AI】-【神经网络是怎么实现的】(四)卷积神经网络

一句话归纳: 1)用1个小粒度的模式,逐个与图像的局部区域进行运算,运算结果反映模式与区域的匹配程度。 2)卷积神经网络与全连接神经网络的区别: 卷积神经网络的输出只与局部输入有连接。参数较少&#xff0…

五款优秀的局域网监控软件推荐:实时监控电脑屏幕的神器

在现代社会,计算机和网络已经成为工作中不可或缺的部分。随着局域网的普及,如何有效地监控和管理局域网内的电脑成为了许多企业和管理者关心的问题。本文将为您推荐五款优秀的局域网监控软件,帮助您实时监控电脑屏幕,提高工作效率…

2023陇剑杯-流量分析篇-wp

1.ez_web Q1:服务器自带的后门文件是什么? 常用http过滤命令:http.request.full_urihttp.request.methodPOST 查看第一个POST请求,发现关键点file_put_contents(备注:file_put_contents内置函数,用于将字…

访学/博后/联培博士关注|不同国家的英语口音辨识度训练

在访问学者、博士后及联合培养的申请过程中,接收方多数都要求英文面试。如果导师的母语为非英语国家,将会带有口音,这样更增加了英语面试难度。如何提升不同国家的英语口音辨识度,使自己的英语表达更加流利,知识人网小…

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记13 - STM32的SDIO学习5 - 卡的轮询读写擦

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记13 - STM32的SDIO学习5 - 卡的轮询读写擦 一、前情提要二、目标三、技术方案3.1 读写擦的操作3.1.1 读卡操作3.1.2 写卡操作3.1.3 擦除操作 3.2 一些技术点3.2.1 轮询标志位的选择不唯一3.2.2 写和擦的卡状态查询3.2.3 写的速度 四、代…

轨道交通巡检机器人的应用范围

在现代轨道交通系统的庞大网络中,无数的轨道、设备和设施交织在一起,如同一个精密的机器在高效运转。而在这背后,轨道交通巡检机器人正悄然登场,它们如同一个个智能的守护者,穿梭于各个场景之中。那么,这些…

python从0开始学习(三)

目录 前言 1、类型转换 1.1 隐式类型转换 1.2 显式类型转换 2、eval函数 总结 前言 上篇我们讲了python中的变量与常量,以及变量类型。本篇文章将接着往下讲。 1、类型转换 python中的数据类型转换包括两种:隐式类型转换和显式类型转换。 1.1 隐式…

SAPUI5基础知识1 - 概览,库,支持工具,自学教程

1. SAPUI5 概览 1.1 SAPUI5 SAPUI5是一种用于构建企业级Web应用程序的开发框架。它是由SAP开发的,基于HTML5、CSS3和JavaScript技术。 SAPUI5提供了一套丰富的UI控件和工具,使开发人员能够快速构建现代化、可扩展和可定制的应用程序。 它还提供了数据…

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

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

Qt 6 开源版(免费) -- 在线安装图解

经常遇到询问:有没有Qt6安装包? ......,真没有呢~~ 从Qt6起,它整了两个重大改变(并非指技术): 在线安装,不再提供单独的安装包主推收费的商业版 当然的,为了培养市场…

SPSS之聚类分析

SPSS中系统聚类分析功能在【分析】—【分类】—【系统聚类】中完成。系统聚类有两种类型,一种是对样本进行聚类,称为Q型聚类;一种是对变量进行聚类,称为R型聚类。在【系统聚类分析】—【聚类】框下选择【个案】——Q型聚类&#x…

微信小程序生成二维码加密(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(&…

iOS - Undefined symbols: 解决方法

Undefined symbols: 是让人苦恼的报错,如何知道是 哪个 symbols 不对呢? 今天探索到下面的方法: 1、点击导航上方 最右侧的按钮,查看历史报错 2、选中报错信息,右键选择 Expand All Transcripts 在出现的详细信息面…

FreeRTOS软件定时器(1-18)

软件定时器简介 定时器:从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可以自定义 定时器周期。 硬件定时器:芯片本身自带的定时器模块,硬件定时器的精度一般很高,每次在定时时…

Java常用命令总结 持续更新中!!!

蓝桥杯JAVA组 推荐输入输出示例 // 基础输入 import java.util.*;public class Main{public static void main(String[] args){} }// 非静态方法调用 new Main.Solution();//static函数里面调用非static函数 类.函数// 更快的输入方式 BufferedReader // 更快的输出方式 Print…

js监听页面的显示和隐藏

下方微信公众号 和微信小程序推荐 js监听页面的显示和隐藏 在JavaScript中,监听页面的显示和隐藏可以通过监听visibilitychange事件来实现。visibilitychange事件会在页面的可见性发生变化时触发。 以下是一个简单的示例,演示如何使用visibilitychan…

《面向对象程序设计及C++》实验报告

《面向对象程序设计及C》实验报告 一、实验目的与实验要求 (1)掌握类的定义、类中成员函数的定义和使用、构造函数和析构函数的定义、功能;掌握对象的使用方法。 (2)掌握静态数据成员、静态成员函数的功能和使用方法…

Linux —— 信号初识

Linux —— 信号初识 什么是信号测试几个信号signal函数函数原型参数说明返回值注意事项示例 后台程序前台转后台检测输入中断向量表 我们今天来继续学习Linux的内容,今天我们要了解的是Linux操作系统中的信号: 什么是信号 信号是操作系统内核与进程之…

判断dll/lib是32/64位、查看lib是导入库/静态库的方法 、查看dll包含的符合、lib包含的函数

一、判断dll/lib是32/64位 原文链接:https://www.cnblogs.com/bandaoyu/p/16752602.html 1. 简便方法: 直接用记事本或者notepad(或txt文本)打开exe文件(dll文件),会有很多乱码,不要头疼,接下…

Vitis HLS 学习笔记--Schedule Viewer 调度查看器

目录 1. 简介 2. Schedule Viewer详解 2.1 视图说明 2.1.1 Operation\Control Step 2.1.2 周期关系图 2.1.3 Schedule Viewer 菜单栏 2.1.4 属性视图 2.2 内容说明 2.2.1 实参(b)解释 2.2.2 实参(a)解释 2.2.3 变量&am…