js垃圾回收新生代和老生代以及堆栈内存详细

js 堆栈内存、新生代和老生代、垃圾回收详聊

要想了解JS内存管理就必须明白存这些js数据的内存又分为:栈内存和堆内存

一、 栈|堆内存(Stack|Heap)

  1. 栈(Stack)内存
    原始值:Number、String、Boolean、Null、Undefined、Symbol和BigInt
    栈内存主要存储原始值数据类型
  2. 堆(Heap)内存
    引用值:Object( Object、Array和Function等)
    堆内存主要存储引用值数据类型
     栈|堆内存

案例1

let n = 1;
let b = true;
let s = "string";
let pObj = {name:'dupha',age:18,address:[{"code": "11","name": "北京市","children": [{"code": "1101","name": "市辖区"}]}]};
let pArr = [1,2,3,4,5];

栈|堆内存案例

案例2

//声明 + 第一次赋值
let person= {name:'dupha',age:18,address:[{"code": "11","name": "北京市","children": [{"code": "1101","name": "市辖区"}]}]};   
//第二次赋值
person = {name:'soeng',age:20,address:[{"code": "11","name": "北京市","children": [{"code": "1101","name": "市辖区"}]}]};  

在这里插入图片描述

第一次赋值第二次赋值

下方算法以谷歌chrome浏览器的V8引擎来讲解

二、垃圾回收常用方法

  1. 引用计数法reference counting
    跟踪对象被引用的次数,如果引用次数是 0,那么该对象不再用到,GC时会将其对象清除

如图:

在这里插入图片描述在这里插入图片描述

引用计数存在问题:循环引用的话,对象内存就无法释放

  1. 标记清除法
    从根节点开始,对其进行深度优先遍历,能够达到的标记活跃对象,不能达到的对象标记死对象。

标记清除法
可以看出,碎片化,后续又多了标记整理法(顾名思义就是标记后,再进行碎片化压缩(整理),提高内存的利用率)
类似于硬盘碎片整理
硬盘碎片整理

三、新生代和老生代

 新生代和老生代

  1. 新生代和老生代内存分配
    众所周知,计算机操作系统分为 32位 和 64位
    新生代和老生代也会给予操作系统的不同位数来进行内存分配
    32位 新生代空间: 32MB (to space 和 from space分别16MB),老生代位700MB
    64位 新生代空间: 64MB (to space 和 from space分别32MB),老生代位1400MB
    node中,可以修改最大内存node --max-old-space-size=4096
	//在查看浏览器内存信息
	window.performance

查看浏览器内存信息

  1. 新生代算法
    新生代算法

scavenger算法:
算法执行周期如下:
第一步:js变量分配内存先在from space上,如果from space满了,执行下一步
第二步:从from space上遍历出活跃对象,判断对象是否已经经过一次周期,
是:判断to space是否超过25%,超过将放入老生代,没超过保持不动
否:将其移至to space
第三步:清空from-Space
第四步:调换to spacefrom space空间
一直循环执行该周期
scavenger算法

  1. 老生代算法
    老生代

标记-清除-压缩(Mark-Sweep-Compaction)算法:

  1. 标记阶段(Mark Phase)
  • 起始点:从一组根对象(如全局对象)开始。
  • 递归访问:递归地访问所有从根对象可达的对象,并将它们标记为“活动”或“可达”。
  • 避免重复访问:使用某种数据结构(如位图或颜色标记)来跟踪已访问过的对象,避免重复访问。
  1. 清除阶段(Sweep Phase)
  • 遍历堆内存:在标记阶段完成后,遍历整个老生代的堆内存。
  • 释放未标记对象:释放所有在标记阶段中未被标记为可达的对象所占用的内存。
  1. 压缩阶段(Compaction Phase)
  • 移动对象:将存活的对象(即标记阶段中标记为可达的对象)移动到堆内存的一端,使它们紧密排列。
  • 更新引用:由于对象在内存中移动了位置,因此需要更新所有指向这些对象的引用,以确保它们指向新的位置。
  • 减少碎片:通过压缩操作,可以消除由清除操作产生的内存碎片,使堆内存更加连续和可用。

标记-清除-压缩

  1. 其他(有趣可自行查阅)
    V8在扫描和标记上,采用过 广度扫描、全停顿标记、增量标记、三色标记等
    清理回收上,采用并行回收,懒性清理等

四、内存泄露有哪些?

  1. 隐式全局变量
function dupha(){
    data = "假设一个很大的Array or Object";
}

通过直接调用(window / globalThis),用完不清除会占用资源。
隐式全局变量

  1. 闭包
    闭包:函数嵌套函数
    在闭包中,如果里面引用外部函数的变量,它被持续保留在内存中,其变量也无法被垃圾收集器回收。
const dupha = function () {
    let BigObject = {text:"这是一个很大的OBJ"};
    return function (y) {
        console.log(y + JSON.stringify(BigObject));
    };
};
let f = dupha();
f(1)

注意: 如果闭包方法用完后,最后将其清空(如:f = null,去除闭包方法引用,下一次垃圾收集将被回收)。
在这里插入图片描述

  1. 用完不移除定时器\事件监听
    创建了一个定时器,如果没有明确地移除它,有可能引起:内存泄漏,无意义的执行或者报错。
function getInfoByKey(id){
    return new Promise((resolve, reject) => {
		// 模拟接口异步请求数据
		setTimeout(() => {
			resolve(`通过Key:${id}来调用返回一个很大的JSON对象`)
		}, 1000)
	})
}
var getData = getInfoByKey;
var id = 0;
setInterval(async function (){
    const data = await getData(id++);
    console.log(data);
},5000)

用完不移除定时器一直调用,还存在引用

为啥上传不了大文件

文件过大,超过规定内存或者其他原因,采用文件切片

文件属性描述
File.name文件名称
File.size文件大小(如: 2MB 2*1024*1024)
File.type文件类型
File.lastModified最后修改时间
把大文件按照每个2MB/1MB大小进行切割成小文件上传到服务器上。

如有不理解或者不准确的欢迎评论/私聊~

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

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

相关文章

UE5启用SteamOSS流程

一、安装OnlineSubsystemSteam插件 1、在UE里安装OnlineSubsystemSteam 2、设置默认开始地图 3、设置DefaultEngine.ini文件: 打开项目根目录/Config/DefaultEngine.ini文件 打开官网的配置说明 复制并粘贴到该文件中 4、设置运行模式 5、测试 确保Steam平台已…

玩转ChatGPT:Suno制作音乐

AI开始进军音乐领域了。 一款音乐AI神器——Suno V3发布,它能够处理从间奏到主歌、副歌、桥段直至尾奏的完整结构,零门槛创作音乐。 需要科学上网,官方网站:https://app.suno.ai/ 使用GPT写个歌词,然后丢进Suno生成…

EMD关于信号的重建,心率提取

关于EMD的俩个假设: IMF 有两个假设条件: 在整个数据段内,极值点的个数和过零点的个数必须相等或相差最多不能超过一 个;在任意时刻,由局部极大值点形成的上包络线和由局部极小值点形成的下包络线 的平均值为零&#x…

聚观早报 | 小米SU7正式发布;xAI推出Grok-1.5

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 3月30日消息 小米SU7正式发布 xAI推出Grok-1.5 红魔9 Pro新品亮相 长城汽车2023年营收 快狗打车2023年度业绩 小…

C++心决之命名空间、重载函数和引用

目录 1. C关键字(C98) 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 3. C输入&输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理--名字修饰(name Mangling) 6. 引用 6.1 引用概念 6.2 引用特性…

二维码门楼牌管理应用平台:构建社区信息新生态

文章目录 前言一、二维码门楼牌管理应用平台的功能优势二、信息展示与居民互动三、提升社区治理效能四、展望未来的发展方向 前言 随着信息技术的迅猛发展,二维码门楼牌管理应用平台逐渐崭露头角,成为社区管理的新宠。通过这一平台,居民可以…

Spring Boot 使用 Redis

1&#xff0c;Spring 是如何集成Redis的&#xff1f; 首先我们要使用jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><gro…

【docker】nexus 本地 maven配置

1、这篇文章中说明了如何搭建私服 【docker】搭建Nexus私服-CSDN博客文章浏览阅读2次。4、点击登陆&#xff08;账号&#xff1a;admin 秘密&#xff1a;在容器内 /nexus-data/admin.password 文件中)注意我的端口号是 10002&#xff0c;注意你的端口号。7、设置maven-central…

博客页面---前端

目录 主页 HTML CSS 文章详细页面 HTML CSS 登录页面 HTML CSS 文章编辑页 HTML CSS 这只是前端的页面组成&#xff0c;还没有接入后端&#xff0c;并不是完全体 主页 HTML <!DOCTYPE html> <!-- <html lang"en"> --> <head>&…

AcWing刷题-有序分数

有序分数 递归 # 求最大公约数 def gcd(a,b):return gcd(b,a%b) if b else a ans [] n int(input()) for i in range(1,n1):for j in range(0,i1):if gcd(i,j)1: # 最简形式ans.append([j,i]) ans.sort(keylambda x:x[0]/x[1]) # 按照从小到大的顺序排 for elem in ans:a,be…

逐步学习Go-Select多路复用

概述 这里又有多路复用&#xff0c;但是Go中的这个多路复用不同于网络中的多路复用。在Go里&#xff0c;select用于同时等待多个通信操作&#xff08;即多个channel的发送或接收操作&#xff09;。Go中的channel可以参考我的文章&#xff1a;逐步学习Go-并发通道chan(channel)…

PyCharm安装及Anaconda关联设置

PyCharm介绍 PyCharm 是一款专为 Python 设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由 JetBrains 开发。它提供了一整套功能强大的工具&#xff0c;帮助开发者更高效地编写、测试和调试 Python 代码。PyCharm 有免费的社区版和付费的专业版。 PyCharm官网链接…

Linux 安装Mysql

安装源文件版本&#xff1a;mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz 安装前&#xff0c;我们可以检测系统是否自带安装 MySQL: rpm -qa | grep mysql如有&#xff0c;类似 mysql-libs-5.1.52-1.el6_0.1.x86_64那可以选择进行卸载: rpm -e mysql-libs-5.1.52-1.el6_0.1…

Xinstall自动邀请代理功能,让App线上推广更高效

在移动互联网时代&#xff0c;App的推广成为了每个开发者都必须面对的问题。线上推广作为一种重要的手段&#xff0c;其效果直接关系到App的下载量、安装量以及用户活跃度。然而&#xff0c;线上推广并非易事&#xff0c;需要借助专业的工具和方法才能实现最佳效果。今天&#…

JAVAEE——多线程进阶,锁策略

文章目录 锁策略乐观锁和悲观锁乐观锁悲观锁两者的比较 读写锁重量级锁和轻量级锁重量级锁轻量级锁 自旋锁公平锁和非公平锁公平锁非公平锁 可重入锁和不可重入锁可重入锁不可重入锁 锁策略 乐观锁和悲观锁 乐观锁 什么是乐观锁呢&#xff1f;我们可以认为乐观锁比较自信&am…

树的重心——树的结构

树的重心是指对于某个点&#xff0c;将其删除后&#xff0c;可以使得剩余联通块的最大值最小。也就等价于一某个点为根的树&#xff0c;将根删除后&#xff0c;剩余的若干棵子树的大小最小。 例如下图的树的重心就是2。 性质&#xff1a; 性质一&#xff1a;重心的若干棵子树打…

代码第三十六天:需要添加的硬币的最小数量

需要添加的硬币的最小数量 题目要求&#xff1a; 解题思路 为方便描述&#xff0c;把 0 也算作可以得到的数。 假设现在得到了区间 [ 0 , s − 1 ] [0,s−1] [0,s−1] 中的所有整数&#xff0c;如果此时遍历到整数 x c o i n s [ i ] xcoins[i] xcoins[i]&#xff0c;那么…

百度云加速方法「Cheat Engine」

加速网盘下载 相信经常玩游戏的小伙伴都知道「Cheat Engine」这款游戏内存修改器&#xff0c;它除了能对游戏进行内存扫描、调试、反汇编 之外&#xff0c;还能像变速齿轮那样进行本地加速。 这款专注游戏的修改器&#xff0c;被大神发现竟然还能加速百度网盘资源下载&#xf…

Linux 学习之路 -- 进程篇 -- 背景介绍

目录 1、冯诺依曼体系架构 2.操作系统 1、冯诺依曼体系架构 再开始学习进程之前我们要先了解一下计算机的体系结构&#xff0c;这里我们以最经典的冯诺依曼体系结构为例&#xff0c;简单介绍一下一下计算机的体系结构&#xff0c;方便我们对进程的理解。 这里的中央处理器就是…

【C++】入门C++(上)

简单唠几句 从今天开始我们就要进入C的学习了 众所周知&#xff0c;C是在C语言的基础上应运而生的&#xff0c;其容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式&#xff0c;为我们在编程上提供了很大的便捷 在接下来的这几篇C入门的博…