javaScript 内存管理

1 js 内存机制

内存空间:栈内存(stack)、堆内存(heap)
  1. 栈内存:所有原始数据类型都存储在栈内存中,如果删除一个栈原始数据,遵循先进后出;如下图:a 最先进栈,最后出栈。

  2. 堆内存:引用数据类型会在堆内存中开辟一个空间,并且会有一个十六进制的内存地址,在栈内存中声明的变量的值就是十六进制的内存地址。

  3. 函数也是引用数据类型,我们定一个函数的时候,会在堆内存中开辟空间,会以字符串的形式存储到堆内存中去,如下图:

    function fn() {
      var i = 10
      var j = 10
      console.log(i + j)
    }
    // 我们直接打印fn会出现一段字符串
    console.log(fn)
    // 打印结果
    /*
      f fn() {
         var i=10;
         var j=10;
         console.log(i+j)
     }
    */
    
    // 加上括号才执行里面的代码
    fn() // 20

    2 垃圾回收

    概念:(我们平时创建所有的数据类型都需要内存)

    所谓的垃圾回收就是找出那些不再继续使用的变量,然后释放出其所占用的内存,垃圾回收会按照固定的时间间隔周期性的执行这一操作。

    javaScript 使用的垃圾回收机制来自动管理内存,垃圾回收是把双刃剑;垃圾回收是不可见的
  • 优势:可以大幅简化程序的内存管理代码,降低程序员的负担,减少因长时间运转而带来的内存泄漏问题。
  • 不足:程序员无法掌控内存,javascript 没有暴露任何关于内存的 api,无法强迫进行垃圾回收,无法干预内存管理。
  1. 引用计数(reference counting)

    跟踪记录每个值被引用的次数,如果一个值引用次数是 0,就表示这个值不再用到了,因此可以将这块内存释放

    原理:每次引用加 1,被释放减 1,当这个值的引用次数变成 0 时,就将其内存空间释放。

    let obj = { a: 10 } // 引用+1
    let obj1 = { a: 10 } // 引用+1
    obj = {} //引用减1
    obj1 = null //引用为0

    引用计数的 bug:循环引用

    // ie8较早的浏览器,现在浏览器不会出现这个问题
    function Fn() {
      var objA = { a: 10 }
      var objB = { b: 10 }
      objA.c = objB
      objB.c = objA
    }

    2.标记清除(现代浏览采用标记清除的方式) 

环境栈(局部)

 V8 回收策略

新生代垃圾回收

from 和 to 组成一个Semispace(半空间)当我们分配对象时,先在 from 对象中进行分配,当垃圾回收运行时先检查 from 中的对象,当obj2需要回收时将其留在 from 空间,而ob1分配到 to 空间,然后进行反转,将 from 空间和 to 空间进行互换,进行垃圾 回收时,将 to 空间的内存进行释放,简而言之 from 空间存放不被释放的对象,to 空间存放被释放的对象,当垃圾回收时将 to 空间的对象全部进行回收

  •  概念:

    标记清除指的是当变量进入环境时,这个变量标记为“进入环境”;而当变量离开环境时,则将其标记为“离开环境”,最后垃圾收集器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间(所谓的环境就是执行环境)

    全局执行环境
  • 最外围的执行环境
  • 根据宿主环境的不同表示的执行环境的对象也不一样,在浏览器中全局执行环境被认为是 window 对象
  • 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境,ECMAScript 程序中的执行流正是由这个方便的机制控制着
  • 全局变量和函数都是作为 window 对象的属性和方法创建的
  • 某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁(全局执行环境只有当关闭网页的时候才会被销毁)
     function foo (){
           var a = 10   // 被标记进入执行环境
           var b = ‘hello’ // 被标记进入执行环境
        }
        foo()  //执行完毕,a 和 b 被标记离开执行环境,内存被回收

    3 V8 内存管理机制

    V8 引擎限制内存的原因
  • V8 最初为浏览器设计,不太可能遇到大量内存的使用场景(表层原因)
  • 防止因为垃圾回收所导致的线程暂停执行的时间过长(深层原因,按照官方的说法以 1.5G 的垃圾回收为例,v8 做一次小的垃圾回收需要 50 毫秒以上,做一次非增量的垃圾回收需要 1 秒以上,这里的时间是指 javascript 线程暂停执行的时间,这是不可接受的, v8 直接限制了内存的大小,如果说在 node.js 中操作大内存的对象,可以通过去修改设置去完成,或者是避开这种限制,1.7g 是在 v8 引擎方面做的限制,我们可以使用 buffer 对象,而 buffer 对象的内存分配是在 c++层面进行的,c++的内存不受 v8 的限制)
  • v8 采用可一种分代回收的策略,将内存分为两个生代;新生代和老生代
  • v8 分别对新生代和老生代使用不同的回收算法来提升垃圾回收效率
新生代对象的晋升(新生代中用来存放,生命较短的对象,老生代存放生命较长的对象)

在新生代垃圾回收的过程中,当一个对象经过多次复制后依然存活,它将会被认为是生命周期较长的对象,随后会被移动到老生代中,采取新的算法进行管理 在 From 空间和 To 空间进行反转的过程中,如果 To 空间中的使用量已经超过了 25%,那么就将 From 中的对象直接晋升到老生代内存空间中

老生代垃圾回收(有 2 种回收方法)

1.标记清除(Mark Sweep) Mark Sweep 是将需要被回收的对象进行标记,在垃圾回收运行时直接释放相应的地址空间,红色的区域就是需要被回收的标记合并(Mark Compact) Mark Compact 将存活的对象移动到一边,将需要被回收的对象移动到另一边,然后对需要被回收的对象区域进行整体的垃圾回收

  • 老生代内存空间是一个连续的结构

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

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

相关文章

DeepWalk: Online Learning of Social Representations(2014 ACM SIGKDD)

DeepWalk: Online Learning of Social Representations----《DeepWalk:用于图节点嵌入的在线机器学习算法》 DeepWalk 是将 word2vector 用到 GNN 上 DeepWalk: 将 Graph 的每个节点编码为一个 D 维向量(无监督学习),E…

linux之 服务器ping百度能通,ping其他网址不通

表症问题 linux上ping域名解析出来的ip地址不正确 linux服务器ping百度能通,ping其他网址不通 linux上ping域名解析出来的ip地址不正确 ping 百度可以,说明dns解析是没问题的 但是,ping 其他网址不通,说明是 请求的其他网址的问…

Talk | PSU助理教授吴清云:AutoGen-用多智能体对话开启下一代大型语言模型应用

本期为TechBeat人工智能社区第548期线上Talk! 北京时间11月21日(周二)20:00,宾夕法尼亚州立大学助理教授—吴清云的Talk已准时在TechBeat人工智能社区开播! 她与大家分享的主题是: “ AutoGen:用多智能体对话开启下一代大型语言模…

根据商品ID获取虾皮数据接口|虾皮商品详情接口|虾皮关键词搜索商品列表接口|虾皮到手价接口|虾皮API接口

虾皮商品详情是指虾皮平台上商品的具体信息,包括但不限于商品名称、描述、价格、图片、评论等。要获取虾皮商品详情,您需要先登录虾皮网站或APP,然后浏览商品页面或搜索商品,找到您感兴趣的商品后,可以查看该商品的详情…

人工智能对我们的生活影响

目录 前言 一、人工智能的领域 二、人工智能的应用 三、对人工智能的看法 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN&#x1f4…

使用 API 管理平台的 5 大理由

组织需要治理和控制API生态系统,这种治理就是API管理的作用。 Uber 使用 API​​(应用程序编程接口)与 Google Maps 和 Twilio 等第三方服务连接,这有助于改善用户体验; Salesforce 提供 API,允许开发人员…

虚函数可不可以重载为内联 —— 在开启最大优化时gcc、clang和msvc的表现

下面是对该问题的一种常见回答: 首先,内联是程序员对编译器的一种建议,因此可以在在重载虚函数时在声明处加上inline关键字来修饰, 但是因为虚函数在运行时通过虚函数表,而内联函数在编译时进行代码嵌入,因…

创作一款表情包生成微信小程序:功能详解与用户体验优化

一、引言 在当今社交媒体充斥着各种趣味表情包的时代,表情包生成工具成为许多用户创作和分享创意的热门选择。为了迎合这一趋势,我设计并开发了一款功能丰富、用户友好的微信小程序,旨在让用户能够轻松而有趣地创作个性化的表情包。这篇博客将…

南京数字孪生赋能工业制造,加速推进制造业数字化转型

随着南京信息技术的迅猛发展和工业管理的不断演进,传统的工业管理方式已经无法满足企业对高效、智能和可持续发展的需求。针对这一情况,数字孪生技术应运而生,为南京工业管理带来了全新的变革和机遇。以数字孪生为理念,三维可视化…

大模型创业“风投”正劲,AGI Foundathon 大模型创业松活动精彩看点

这是一场万众瞩目的大模型领域盛会。当来自世界各地的顶尖大模型开发者、创业者、投资人汇聚一堂,他们对大模型应用层的思考碰撞出了哪些火花?应运而生了哪些令人眼前一亮的AI-Native产品? 让我们一起来回顾吧~

C#核心笔记——(二)C#语言基础

一、C#程序 1.1 基础程序 using System; //引入命名空间namespace CsharpTest //将以下类定义在CsharpTest命名空间中 {internal class TestProgram //定义TestProgram类{public void Test() { }//定义Test方法} }方法是C#中的诸多种类的函数之一。另一种函数*,还…

算法-二叉树-简单-二叉树的直径、将有序数组转换成二叉搜索树

记录一下算法题的学习9 二叉树的直径 题目:给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示 读完题目&…

如何打造适用的MES管理系统解决方案

在当前的制造业领域,项目型生产企业面临着独特的挑战。尽管国外的大型软件公司提供了某些解决方案,但由于地域、文化和制度的差异,这些方案并不完全满足企业的实际需求。为了解决这一难题,我们必须以客户为中心,围绕他…

机器学习中的特征选择:方法和 Python 示例

布拉加德什桑达拉拉詹 一、说明 特征选择是机器学习流程中至关重要且经常被低估的步骤。它涉及从数据集中的原始特征集中选择最相关的特征(输入变量或属性)的子集。特征选择的重要性怎么强调都不为过,因为它直接影响机器学习模型的质量、效率…

【C++】类与对象(中)

一、类的默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会自…

解析大型语言模型的训练、微调和推理的运行时性能

背景 这篇论文是截至目前为数不多的介绍大模型训练配套环境比对的论文,对于想要入门大模型训练同学是个不错的入门资料。比较了不同尺寸模型(比较常用的7、13、70b),在不同型号gpu、训练框架、推理框架数据。结合自己实际工作需要…

华为认证 | HCIE考证流程详解!

HCIE(Huawei Certified ICT Expert,华为认证ICT专家)是华为认证体系中最高级别的ICT技术认证,旨在打造高含金量的专家级认证,为技术融合背景下的ICT产业提供新的能力标准,以实现华为认证引领ICT行业技术认证…

numpy报错:AttributeError: module ‘numpy‘ has no attribute ‘float‘

报错:AttributeError: module numpy has no attribute float numpy官网:NumPy 报错原因:从numpy1.24起删除了numpy.bool、numpy.int、numpy.float、numpy.complex、numpy.object、numpy.str、numpy.long、numpy.unicode类型的支持。 解决办法…

小程序Tab栏与页面滚动联动

小程序tab栏切换与页面滚动联动 tab栏与页面滚动联动点击tab栏页面跳到指定位置滚动页面时切换tab栏 tab栏与页面滚动联动 在进行小程序开发时,需要实现点击tab栏页面滚动到某一指定位置,并且滚动页面时,小程序的tab栏进行切换。 在一开始&a…

MP3音频文件体积怎么缩小?压缩的方法有哪些?

压缩音频文件可减小文件的大小,从而更轻松地上传到其他平台,或轻松的通过电子邮件进行分享。除此之外,压缩音频文件还可以节省硬盘上的储存空间。那MP3音频文件体积怎么缩小呢?继续阅读可查看压缩的详细流程。 什么是音频文件压缩…