JavaScript 的内存管理

420 阅读3分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

前言

任何程序的运行都需要分配内存,如我们运行一个网页。如果分配的一些内存不能及时的得到释放,就称为内存泄露,当出现大量的内存泄露时,就是内存溢出,内存溢出简单来说就是我们使用的内存大于系统能够提供的内存空间,内存溢出的的直接现象就是页面的卡顿,更严重的就是页面的崩溃。导致用户体验差,用户流失。

本文你将了解:

  • js 的内存分配
  • 垃圾回收机制
  • 垃圾回收策略
  • V8 的内存管理
  • V8 的回收策略

内存的生命周期

不管什么程序语言,内存生命周期基本是一致的: 

JavaScript 的内存分配

JS的数据类型分为两种,一种是原始数据类型,包括string、number、boolean、null、undefined、sybmol、bigint 。还有一种是引用数据类型Object。数据类型不同在内存存储方式也是不一样的,内存分为三种,栈内存、堆内存和代码空间。

栈内存 是一种后进先出的结构,例如一个水桶,水桶的底部就相当于栈底,水桶的进水处就相当于栈顶,水桶的水由栈顶进入,栈顶 出去,由于原始数据类型是大小固定的,由内存自动分配内存所以他存在于栈内存中。我们创建一个变量,例如var a = 10; 在内存中是先将10放入内存的,在将a放入内存,然后把a和10关联起来。而引用数据类型,大小不固定,存储在堆中,例如 一个对象var obj = {},首先在堆中会开辟出一块内存出来,存储对象的值,然后生成一个十六进制的地址码,最后在栈 中放入这个地址码,并放入obj,使地址码和obj关联起来。

垃圾回收机制

找出那些不在继续使用的变量,然后回收他们所占用的内存,垃圾回收器会隔一段时间进行一次垃圾回收,不同的引擎这个回收时间不一致。js使用垃圾回收来自动管理内存,但是垃圾回收是一把双刃剑。

垃圾收集策略

V8 的内存管理

首先我们要知道 V8 是有内存限制的,这里你可能会奇怪为什么 V8 会有内存的限制了?

哪 V8 的回收测试又是怎么样的了。其实 V8 采用分代回收的策略,将内存分为新生代老生代。V8对新生代和老生代采用不同的垃圾回收算法来提升效率。

总结

内存管理存储比较抽象,但是和我们日常的研发息息相关,了解内存的管理,对日常处理内存问题也会更加得心应手一些。希望对你有帮助。

如果你觉得写得不错,帮忙点个赞吧。

参考