💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[toc] ### 1.变量在内存中的存储 1.栈内存stack:六个基本类型,string,number,boolean,undefined,null,symbol 2.堆内存heap:在栈中存放一个地址,堆中开辟一块空间,如:Object + 函数在堆中的存储: ``` 1.函数体中的代码会以函数字符串的形式保存在堆内存 2.栈内存会存放一个地址 3.函数执行过程中,会找到堆内存的函数字符串,然后执行 ``` ### 2.什么是垃圾回收机制 v8引擎存在一个垃圾回收器,他会按照固定的时间间隔周期性的寻找不再使用的变量,并将它们从内存中释放 ### 3.垃圾回收机制如何管理内存(gc原理) #### 1.引用计数 1.解释:跟踪某个值被引用的次数,如果一个值的引用次数是0的时候,就表示可以将这块内存释放了 2.原理:每次引用的时候次数+1,被释放的时候-1 ```js var obj1 = {a: 1} // {a:1}的引用次数+1 var obj2 = {a: 1} // {a:1}的引用次数+1 obj1 = {} // {a:1}的引用次数-1,但是这块空间并未完全消除,因为obj2还引用着 obj1 = null // obj1 对{a: 10}的引用次数为0 obj2 = null // obj2 对 {a: 10} 的引用次数为0,此时这块空间也会被回收 ``` 3.bug:两个对象互相引用时,导致引用次数一直循环存在,内存泄漏 ```js // function fn() { var obj1 = {a: 1} var obj2 = {b: 2} obj1.a = obj2 obj2.b = obj1 console.log('1', obj1); console.log('2', obj2); } fn() ``` #### 2.标记清除(常用) 1.解释:当变量进入环境时,这个变量标记为`进入环境`,而当变量离开环境时,将其标记为`离开环境`,最后垃圾回收器会销毁并回收被标记为`离开环境`的值所占用的空间 2.执行环境(执行上下文): + 定义了变量或函数有权访问的其他数据 + 每个执行环境都有一个与之关联的变量对象(variable obejct),环境中定义的所有变量和函数都保存在这个对象中 3.全局执行环境: + 浏览器是window,关闭网页或者浏览器才会销毁 + node中是global,关闭应用程序才会销毁 4.局部执行环境: + 当执行流进入函数时,会将该函数的环境推到一个环境栈中。 + 当该函数执行之后,栈将其环境弹出,把控制权返回到之前的执行环境 ### 4.V8的回收策略:GC GC算法采用了分代回收: + 新生代:存在from和to两部分 ``` 1.将内存空间分为from和to两部分,一个使用,一个空闲 2.新分配的对象会被放入from空间,当from空间占满时,新生代GC就会启动 3.GC算法会检查from空间中存活的对象并复制到to空间中,如果有失活的就会销毁 4.复制完成后将from空间与to空间互换, GC结束 ``` + 老生代:连续的结构 标记清除,压缩算法 ``` 1.会先启动标记清除算法 2.清除对象后会造成堆内存出现碎片,当碎片超过一定限制后会启动压缩算法。 3.将存活的对象移到一边,将回收的对象移到另一边 ```