程序员鸡皮
文章 分类 评论
109 3 29

站点介绍

一名PHP全栈程序员的日常......

V8引擎详细的内存是怎样的?

abzzp 2026-02-04 1 0条评论 前端 前端

首页 / 正文
本站是作为记录一名北漂程序员编程学习以及日常的博客,欢迎添加微信BmzhbjzhB咨询交流......

发布于2024-07-04

我们的v8引擎中的内存是如何分配的,他分为新生代和老生代,新生代是那种调用次数较少的对象,老生代里面存放的就是我们多次调用的对象。如下图所示:

 title=

新生代空间(New Space /Young Generation)

主要放的是我们生命周期短的小对象,频繁的销毁和创建。新生代分为两个半空间From SpaceTo Space。初始的时候我们先分别内存到From Space,当其中的某个小对象被销毁的时候,就会使用复制算法,将From Space中的小对象复制到To Space,当内存中又有新的小对象生成的时候,就会先增加再调用复制算法,就是先将To Space里面增加这个小对象,然后复制给From Space对象。同时使用标记算法,记录调用次数,当调用次数大于二或多次调用就会将该对象放到老生代。这里我们要知道From SpaceTo Space会一直进行角色互换。

老生代空间(Old Space /Old Generation)

老生代空间里面放的就是存放生命周期长或从新生代晋升过来的对象。当我们的对象在新生代调用两次以上就会自动升级到老生代。

这里主要分为两个区域:

老指针空间(OldPointer Space)

主要存放包含其他对象的指针对象。

老数据空间(OldData Space)

存放的就是原始数据(字符串,数字),不含其他对象的指针。

大对象空间(Large Object Space)

存放大对象,就是超过新生代存放大小的数组或对象。这些对象直接在大对象空间中分配,避免在新生代和老生代之间的复制操作

代码空间(Code Space)

存放编译后的函数代码

单元空间(Cell Space)

用于存放小的数据结构,比如闭包的变量环境。

属性单元空间(Property Cell Space)

存放对象的属性值,主要针对全局变量或者属性值,对于访问频繁的全局变量或者属性值来说,V8在这里存储是为了提高它的访问效率。

映射空间(Map Space)

存放对象的映射(即对象的类型信息,描述对象的结构)。

当你定义一个Person 构造函数时,可以通过它创建出来person1和person2。这些实例(person1 和person2)本身存储在堆内存的相应空间中,具体是新生代还是老生代取决于它们的生命周期和大小。每个实例都会持有一个指向其映射的指针,这个映射指明了如何访问name 和age 属性

堆内存(Heap Memory)与栈(Stack)

堆内存:JavaScript 对象、字符串等数据存放的区域,按照上述分类进行管理。

栈:用于存放执行上下文中的变量、函数调用的返回地址(继续执行哪里的代码)等,栈有助于跟踪函数调用的顺序和局部变量。

补充

什么是垃圾回收机制,他是如何帮助我们管理内存的?

随着硬件的发展,我们电脑内存的容量越来越大,但是也有内存不够用的情况。因此内存管理是非常有必要的。垃圾回收机制在我们现代化的编程语言中通常帮助我们自动回收来防止内存泄漏,增加代码运行效率。
在运行时,垃圾回收通常监听每个函数的生命周期来工作,当垃该函数不被调用的时候就视为垃圾。一旦这些标记为垃圾的对象被识别,垃圾回收机制就将他们销毁,从而腾出更多内存来为新的对象使用。

垃圾回收机制一般使用垃圾回收算法,一般使用:循环计数,标记清除,标记整理。

循环计数

就是将我们调用的对象关联计数器,程序每被调用一次,关联计数器就+1,当我们的对象关联计数器大于二的时候一般就会被程序转换为机器码,提高运行效率。当我们对象的关联计数器为0的时候,循环计数算法就会将该对象销毁。腾出更多空间给新对象使用。

标记清除

标记清除算法就是,从第一个对象开始,标记每个对象的可达性,如果当前的对象没被标记就会被清除。

标记整理

标记整理算法就是在标记清除之后,内存空间是不连续的,为了更高的利用内存空间,通常会将不连续的空间通过标记整理算法来减少内存碎片,增加内存的利用效率。

V8引擎的垃圾回收机制具体是如何工作的?

V8引擎使用了一种高度优化的垃圾回收机制来管理内存采用了标记:清除、标记整理,同时又结合了多种策略来实现高效的内存管理,包括结合了分代回收(Generational Collection)和增量回收(Incremental Collection)等多种策路。

分代回收:V8将对象分为“新生代"和"老生代"。新生代存放生命周期短的小对象,使用高效的复制式垃圾回收算法;而老生代存放生命周期长或从新生代晋升而来的对象,使用标记-清除或标记·整理算法。这种分代策略减少了垃圾回收的总体开销,尤其是针对短命对象的快速回收。

增量回收:为了减少垃圾回收过程中的停顿时间,V8实现了增量回收。这意味着垃圾回收过程被分解为许多小步骤,这些小步骤穿插在应用程序的执行过程中进行。这有助于避免长时间的停顿,改善了应用程序的响应性和性能。

延迟清理和空闲时间收集:V8还尝试在CPU空闲时进行垃圾回收,以进一步减少对程序执行的影响。

这些技术的结合使得V8能够在执行lavaScript代码时有效地管理内存,同时最小化垃圾回收对性能的影响

感谢大家观看

评论(0)

最新评论

  • 古競技場

    读起来像小说。继续保持 带来的灵感。

  • 奧運聖火

    让人精神焕发的 帖子! 我准备订票了。

  • abzzp

    以后焦虑了或者迷茫了记得回来看看[[流泪]]

  • 三十三瀑布

    我非常喜欢 出行博客。鼓舞人心查看路线。

  • 天星碼頭

    你们的博客 百分百 帮助选择路线。坚持!

  • 日落鼓掌

    信息丰富的 出行资源! 越来越棒!

  • digital banking

    My brother suggested I might like this blog. He was entirely right. This post actually made my day. You cann't imagine just how much time I had spent for this information! Thanks!

  • 碧海藍灣

    我热爱, 写得很实在。你的博客 就是 最好的例子。很出色。

  • digital banking

    I've learn several good stuff here. Certainly price bookmarking for revisiting. I surprise how so much effort you put to make such a great informative website.

  • fintechbase

    It's not my first time to pay a visit this web page, i am visiting this website dailly and get good facts from here every day.

日历

2026年02月

1234567
891011121314
15161718192021
22232425262728

文章目录

站点公告
本站是作为记录一名北漂程序员编程学习以及日常的博客,欢迎添加微信BmzhbjzhB咨询交流......
点击小铃铛关闭
配色方案