前端学习过程中的笔记

168 阅读2分钟

  算是在把以前和以后学习过程中的笔记记录下来,用于巩固知识,方便日后复习吧,算不上分享,毕竟我记的东西,早就被各路大神说烂了,不过如果能帮到大家,也算不错。如果有错误或者更好的方法等等,希望指出。

  那么第一篇,整活儿。

 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采用增量标记的方法,回收一会儿,执行 一会儿,如此循环直到回收完毕