JavaScript内存管理

news2024/11/15 15:33:23

JavaScript 是一个弱类型的、动态语言,在执行一段 JS 代码时,需要经历编译、执行、内存回收阶段。

一、编译阶段

请添加图片描述

JS 代码执行时,会首先创建全局执行上下文、以及函数执行上下文,上下文的执行顺序按照栈的方式进行调用,所以也叫做函数调用栈

创建上下文时,会执行编译阶段,这一阶段会确定作用域,作用域确定了上下文有权限、且按一定的顺序访问的变量、函数。

进入一个上下文时,会经历变量环境的创建、初始化、赋值,这就导致了常见的变量提升问题。若是ES6环境时,还会额外多出词法环境,用于存储ES6的声明。

二、栈、堆

执行上下文存储于栈,引用对象存储于堆。

当遇见引用对象时,栈中存储的是对象在堆中的地址。所以会有这么一个现象:当将对象复制给一个变量时,修改另一个对象时,原对象的值也会发生变化。示例:

var a = { name: "xxx" };
var b = a;
b.name = "yyy";

console.info(a); // {name: 'yyy'}

三、内存

JS 的内存分配是动态,不需要事先申请,同时内存也是自动释放、不需要手动释放。

占用的内存会随着上下文的执行结束而释放,占用的内存使用另一套机制。

V8 将堆空间分为两个区域:

  • 新生代。存放生存时间短的对象;空间小,一般1~8M
  • 老生代。存放生存时间久的对象;空间大。

通用的垃圾回收流程:

  1. 标记活动对象和非活动对象
  2. 清理非活动对象占据的内存
  3. 内存整理

3.1 新生代垃圾回收策略

采用 Scavenge 算法,基本原理:

  • 将空间对半分为对象区域和空闲区域
  • 当对象区域快满时,执行一次清理过程
  • 为对象区域的垃圾做标记,将存活的对象有序地、复制到到空闲区域,然后清空对象区域
  • 对象区域、空闲区域角色反转,等待下一次清理流程

备注:当经过两次垃圾回收依然还存活的对象,会被移动到老生代区域,即对象晋升策略

3.2 老生代垃圾回收策略

A. 策略

依然采用标记清除策略,标记存活对象,清除垃圾。

与新生代回收策略不同的是,不会分两个区域(对象区域、空闲区域)。所以,当清理垃圾后,存储空间不是连续的,需要执行整理过程。

B. 影响

垃圾回收器的执行是占用主线程的,即会阻塞JavaScript的执行,当垃圾回收执行结束,再恢复脚本执行。这种行为叫做全停顿(stop-the-world)

C. 优化

为了降低老生代的垃圾回收而造成的卡顿,V8 将标记过程分为一个个的子标记过程,同时让垃圾回收标记和 JavaScript 应用逻辑交替进行,直到标记阶段完成,我们把这个算法称为增量标记(Incremental Marking)算法

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

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

相关文章

面试题: JVM内存结构

目录目的资源概览JVM内存溢出分类类型1: OutOfMemoryError类型2: StackOverflowError方法区与永久代、元空间之间的关系目的 学习记录, 面试准备 资源 B站的一个讲高频面试题的一个学习视频 概览 线程私有 ① 程序计数器 ② 虚拟机栈线程共享 ① 堆 ② 方法区 JVM内存溢…

RSA密钥协商过程

目录 TSL握手过程 RSA密钥协商握手过程 TLS第一次握手 TLS第二次握手 客户端验证证书 TLS第三次握手 TLS 第四次握手 RSA 算法的缺陷 TSL握手过程 HTTP 由于是明文传输,所谓的明文,就是说客户端与服务端通信的信息都是肉眼可见的,随…

linux常用指令讲解

文章目录 前言一、指令详解总结前言 Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。严格来讲,Linux只是操…

分布式锁的实现

目录分布式锁分布式锁的引出单体锁存在的问题分布式锁的引出分布式锁的设计思路分布式锁的常见应用场景分布式锁方案分布式锁 分布式锁的引出 单体锁存在的问题 在单体应用中,如果我们对共享数据不进行加锁操作,多线程操作共享数据时会出现数据一致性问…

【Kuangbin简单DP】平整数组

4562. 平整数组 - AcWing题库 题意&#xff1a; 思路&#xff1a; 一开始想的是 设DP状态是&#xff1a;dp[i][0/1]表示阶段到 i &#xff0c;然后前面是递增or递减的最小sum的集合 然后我是怎么转移的呢&#xff0c;现在看来感觉挺好笑的&#xff1a; #include <bits/…

Golang 函数使用的注意事项和细节

来自&#xff1a;尚硅谷-韩老师 尚硅谷 1&#xff09;函数的形参列表可以是多个&#xff0c;返回值列表也可以是多个 2&#xff09;形参列表和返回值列表的数据类型可以是值类型和引用类型 3&#xff09;函数的命名遵循标识符命名规范&#xff0c;首字母不能是数字&#xf…

京东购物成功订单已开具个人发票不能报销怎么申请更换重新开具企业发票用于报销?

原文来源&#xff1a;https://www.caochai.com/article-4109.html 京东购物订单的发票开成个人了可以更换成企业发票吗&#xff1f; 可以&#xff0c;通过京东购物完成的订单默认开个人发票&#xff0c;如果对发票有要求需要开企业发票的可以申请更换重新开企业发票&#xff1…

一文读懂JVM虚拟机:JVM虚拟机的内存管理(万字详解)

JVM虚拟机的内存管理 文章目录JVM虚拟机的内存管理JVM与操作系统Java虚拟机规范和 Java 语言规范的关系java虚拟机的内存管理JVM整体架构一、PC 程序计数器二、虚拟机栈三、本地方法栈四、堆Java 堆概念年轻代和老年代对象分配过程堆GC元空间为什么要废弃永久代&#xff0c;引入…

动手学习深度学习-《矩阵运算》

标量导数 常用求导&#xff1a; yyyaaaxnx^nxnexp(x)exp(x)exp(x)log(x)log(x)log(x)sin(x)sin(x)sin(x)dydx\frac{dy}{dx}dxdy​000nxn−1nx^{n-1}nxn−1exp(x)1x\frac{1}{x}x1​cos(x)cos(x)cos(x) 求导公式&#xff1a; yyyuvuvuvuvuvuvyf(u),ug(x)yf(u),ug(x)yf(u),ug(x)d…

植物大战僵尸:学会使用人造指针

通过向游戏中注入一段特殊的汇编代码&#xff0c;实现自动获取动态地址&#xff0c;省略找基址的麻烦。该方法适用于游戏基址层数过多无法直接获取到基址&#xff0c;游戏根本无法找到基址。 1.打开CE工具并附加游戏进程&#xff0c;首先通过遍历的方式找到阳光的动态地址&…

zookeeper之master选举代码实现

master选举的基本概念 &#xff08;1&#xff09;假设有一个系统A,它向外提供了一个服务&#xff0c;叫做服务B。并且这个服务需要24小时持续不断的向外提供。也就是提供服务的机器不能够有单点故障。于是我们考虑使用集群。 &#xff08;2&#xff09;我们采用的是master-sla…

傻白入门芯片设计,如何做文献笔记(十九)

Article: 文献出处&#xff08;方便再次搜索&#xff09; 作者文献题目文献时间Data: 文献数据&#xff08;总结归纳&#xff0c;方便理解&#xff09; 这篇文章的目的结论背景介绍结果方法&#xff08;可选&#xff09;Comments: 对文献的想法 &#xff08;强迫自己思考&#…

Java人脸识别相册分类按时间分类相册按城市分类相册app源码

简介 后台Java&#xff0c;前台mui开发的android app&#xff1b;主要是按拍摄时间&#xff0c;人脸&#xff0c;城市进行相册照片的分类。 演示视频 https://www.bilibili.com/video/BV1XP4y187rA/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 技…

MySQL调优-Explain详解和索引最佳实践

目录 Explain工具介绍 Explain分析示例 explain 两个变种 explain中的列 1.id列 2.select_type列 3. table列 4.type列 5. possible_keys列 6. key列 7. key_len列 8. ref列 9. rows列 10.Extra列 索引最佳实践 1.全值匹配 2.最左前缀法则 3.不在索引列上做任何操…

2D 平台动作冒险游戏

本文实现比较流畅的跑和跳跃 跑的动画需要从idle经历到walk再到run的过程&#xff0c;这个过程可以用融合树实现 也可以让玩家在按下按键时先固定播放完一个walk的动画&#xff0c;然后再自动切换到run的状态。 只不过在任何状态时&#xff0c;只要玩家松开了按键&#xff0c;…

钧瓷产业数字化,将促使禹州走向更高级的社会形态——钧共体

讲好钧瓷产业的故事 有深度的故事,有温度的内容 有态度的文字,有立场的思考 版权声明:钧瓷内参独家发布,侵权必究 第334期 钧瓷内参 2023年1月1日 这里的上市指沪深的主板,创业板和科创板,区域的挂牌不算。 这个数据是根据禹州钧瓷产业2022…

GPU服务器之Colab配置及使用教程

在进行深度学习过程中&#xff0c;不可避免需要进行炼丹的操作&#xff0c;而博主的电脑本身性能就很拉跨&#xff0c;一旦再运行其他的应用便是寸步难行&#xff0c;最好的办法便是再买一台&#xff0c;哈哈哈&#xff0c;当然也可以使用一些云服务器来进行&#xff0c;博主这…

MySQL调优-深入理解MySQL索引底层数据结构与算法

目录 索引的定义 B-Tree (1) 非叶子节点不存储data数据&#xff0c;只进行存储索引(这个索引是冗余的索引&#xff0c;多余的)&#xff0c;可以放更多的索引 (2) 叶子节点包含所有的索引字段 (3) 叶子节点用指针相互连接&#xff0c;提高区间访问的性能 Hash (1) 对索引的…

基于pybind11的c++开发cuda算子用于python调用

一、环境 win10VS2022python39pybind11最新版git下载源码,后边会用:https://github.com/pybind/pybind11同时通过pip install pybind11,python环境下也要安装cuda环境配置参考:https://zhuanlan.zhihu.com/p/488518526二、cuda核函数动态库生成 步骤一:创建cuda项目 创…

VueElement

一、vue 1.1 概述 接下来我们学习一款前端的框架&#xff0c;就是VUE。 Vue 是一套前端框架&#xff0c;免除原生JavaScript中的DOM操作&#xff0c;简化书写。 我们之前也学习过后端的框架 Mybatis &#xff0c; Mybatis 是用来简化 jdbc 代码编写的&#xff1b;而 VUE 是前…