写在前面:众所周知,当咱们想学习某些知识或者解决某些技术难题的时候,网络或者书籍上就会有一万个大牛为你解惑答疑。那么我为何还要关公面前舞大刀,花费大量的时间去写这些文章呢?目的有两个,第一是想经过写写技术文档,来提高本身的表达总结能力;第二则是由于好记性不如烂笔头的道理,短期内可能会以为这是一个浪费时间浪费精力的事情,可是从长远来看,这无疑会加深咱们对知识的理解并巩固咱们的知识体系。git
栈内存由编译器自动分配与释放。咱们能够直接操做栈内存中的值。js中的基本数据类都有固定的大小,被分配到栈内存中。这些基本类型的值都是按值引用。将一个基本类型的值赋值给另一个基本类型时,会为这个新的值从新建立一个值并保存在栈内存中。github
堆内存是链表结构的类型,能够动态分配大小,js引用类型占用内存空间的大小不固定,存储在堆内存中。因为JS不容许直接访问堆内存中的位置,所以咱们不能直接操做js的引用类型。而是生成一个指针,并将它放到栈内存中,经过这个指针来操做引用类型。算法
如今浏览器基本都在使用标记-清除的算法来执行垃圾回收。而不是使用引用计数的方式,由于引用计数方式没法释放循环引用结构的内存占用。 标记清除算法的核型概念是:从根部(在JS中就是全局对象)出发定时扫描内存中的对象。凡是能从根部到达的对象,都是还须要使用的。那些没法由根部出发触及到的对象被标记为再也不使用,稍后进行回收。浏览器
对于持续运行的服务进程(daemon),必须及时释放再也不用到的内存。不然,内存占用愈来愈高,轻则影响系统性能,重则致使进程崩溃。 对于再也不用到的内存,没有及时释放,就叫作内存泄漏(memory leak)网络
参考:闭包