算是在把以前和以后学习过程中的笔记记录下来,用于巩固知识,方便日后复习吧,算不上分享,毕竟我记的东西,早就被各路大神说烂了,不过如果能帮到大家,也算不错。如果有错误或者更好的方法等等,希望指出。
那么第一篇,整活儿。
JS内存
基础数据类型是保存在栈内存中的,引用数据类型时保存在堆内存中的,函数也属于引用类型
垃圾回收
找到不再使用的变量,释放其内存,垃圾回收器会周期性的执行这一操作
优点:简化内存管理代码,降低程序员负担,避免长时间运行造成的内存泄露
缺点:js没有包含任何和内存有关的API,无法干预内存回收
V8引擎
v8引擎时限制了内存大小的,原因:最初是为浏览器设计的,基本不需要用到大量内存的情况,同时也是为了防止内存回收时,暂停JS时间过长(内存回收时,会暂停js执行)
v8引擎将堆内存分为新生代和老生代
新生代64位系统为32MB,分成from 和to 两块,from 为真在使用的空间,to 为闲置空间,内存回收的时候,from 空间中还在使用的变量会复制一份到to空间中,失去引用的会删除,然后使用Scavenge算法,对to空间进行整顿,然后from 和to 的身份会互换
Scavenge算法的缺点:只能使用一半内存空间,但是因为新生代的生命周期很短,所以反而很合适
新生代中的内存如果尽力过多次内存回收还没有被回收,或者to中的空间占用超过25%,就会晋升到老生代
老生代使用标记清除(现代浏览器基本使用),变量进入环境是,标记‘进入环境’,离开则会标记‘离开环境’,最后垃圾回收器会回收带有标记的值,并且回收他们的内存空间
由于JS是单线程,如果回收任务非常繁重,会严重阻碍JS进程,这时候V8采用增量标记的方法,回收一会儿,执行 一会儿,如此循环直到回收完毕