JS的那些事,js执行,内存的分配及使用,垃圾回收机制底层原理面试知识点(二)

js的那些事

js 程序数据状态 ==》内存

分配 存放声明的数据 获取使用的数据 堆内存 栈内存

​ 栈内存 存储静态数据 函数和对象的引用地址 基本数据类型 函数执行时分配的内存(执行栈)

​ 高位 存放栈数据

​ 栈内存 当前函数执行完成之后 出栈相关数据

​ 低位 存放堆数据(不可控大小的数据,并且不知道什么时候没有被访问了)
具体看最后例子eg的最后一张图。

GC 垃圾算法

已知js是单线程的 垃圾回收的过程会影响js的执行 也就是GC执行的时候 js是暂停的

​ V8来执行js,而线程来让V8执行js,线程还要调度 css的解析,html的解析 layout的解析然后遇到js的时候,叫v8来解析。js执行的时候会遇到分配数据 当内存太小了,就触发GC 阻塞js执行

新生代数据 (新创建 存在堆里面的数据)

​ 新生代数据→存活少 Scavenge算法 划分两段(一段是使用 【达到条件的时候也就是存不下数据了,内存满了触发垃圾回收机制】将存活的数据拷贝到闲置 然后把使用状态的清空 一段是闲置,当获取了拷贝来的数据它就变成了使用状态并且全都做了标记,当有新的数据进来时那些则没有标记,当再次触发垃圾回收的时候,被标记的那些就会被拷贝并且变成老生代数据,而没被标记的会被进行标记,拷贝到闲置的那一半百年。被清空的那一半边变为了闲置状态)

晋升条件:第一次扫描被标记了,第二次还存活。判断是否存活:引用计数(不同引擎不一样)
在这里插入图片描述

老生代数据 (上一次扫描过但是没有被清理掉,还在使用的数据)

​ 老生代数据不容易被回收(不断晋升) 慢慢晋升上来的数据 数据多 存活多

​ 两个算法结合来处理老生代 标记清除 标记整理

​ 删死数据

标记清除【mark sweep】1.遍历 存活 →GC时间长 →浏览器卡顿 2.删除没有被使用的数据(少数)内存段是不连续的,与标黄为存活的,有间隙所以有内存,但是分配不了大数据了 →触发标记整理 移动整个内存段 成本很大 GC时间长→浏览器卡顿

解决GC时间长:增量

eg:

var a = 1 ;
var b = 2 ;
// 堆数据 新生代
function Test(){
    return function d(){
        return b
    }
}

var getD = Test();
const num = 4;
const name ='lly'
const isNB = 'true'

const obj={
    count:1
}

function a(){
    let name = "1.24"
    console.log(name)
}
a()

在这里插入图片描述
这里需要注意的是 a()和isNB之间还存了个a的引用地址

执行a函数,同样也在栈内存。a执行的时候它需要用的数据 必须是栈里面有的。
在这里插入图片描述

在这里插入图片描述

写在后面

学习的京城一灯的课程,觉得讲的不错随即记录成文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值