1. 谈谈你对 Javascript 垃圾回收机制的理解?
1、标记清除(mark and sweep)
这是 JavaScript 最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为 “离开环境”
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了
2、引用计数(reference counting)
在低版本 IE 中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加 1,如果该变量的值变成了另外一个,则这个值得引用次数减 1,当这个值的引用次数变为 0 的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为 0 的值占用的空间
在 IE 中虽然 JavaScript 对象通过标记清除的方式进行垃圾回收,但 BOM 与 DOM 对象却是通过引用计数回收垃圾的,也就是说只要涉及 BOM 及 DOM 就会出现循环引用问题
2. JS 里垃圾回收机制是什么,常用的是哪种,怎么处理的?
JS 的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存
JS 中最常见的垃圾回收方式是标记清除
工作原理:是当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其 标记为“离开环境”。标记“离开环境”的就回收内存
工作流程:
垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记
去掉环境中的变量以及被环境中的变量引用的变量的标记
再被加上标记的会被视为准备删除的变量
垃圾回收器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间
3. 什么是进程、什么是线程、它们之间是什么关系
1、进程:
1.1)程序执行时的一个实例
1.2)每个进程都有独立的内存地址空间
1.3)系统进行资源分配和调度的基本单位
1.4)进程里的堆,是一个进程中最大的一块内存,被进程中的所有线程共享的,进程 创建时分配,主要存放 new 创建的对象实例
1.5)进程里的方法区,是用来存放进程中的代码片段的,是线程共享的
1.6)在多线程 OS 中,进程不是一个可执行的实体,即一个进程至少创建一个线程 去执行代码
2、线程:
2.1)进程中的一个实体
2.2)进程的一个执行路径
2.3)CPU 调度和分派的基本单位
2.4)线程本身是不会独立存在
2.5)当前线程 CPU 时间片用完后,会让出 CPU 等下次轮到自己时候在执行
2.6)系统不会为线程分配内存,线程组之间只能共享所属进程的资源
2.7)线程只拥有在运行中必不可少的资源(如程序计数器、栈)
2.8)线程里的程序计数器就是为了记录该线程让出 CPU 时候的执行地址,待再次分配到 时间片时候就可以从自己私有的计数器指定地址继续执行
2.9)每个线程有自己的栈资源,用于存储该线程的局部变量和调用栈帧,其它线程 无 权访问
3、关系:
3.1)一个程序至少一个进程,一个进程至少一个线程,进程中的多个线程是共享进 程 的资源
3.2)Java 中当我们启动 main 函数时候就启动了一个 JVM 的进程,而 main 函数所在线 程就是这个进程中的一个线程,也叫做主线程
3.3)一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程 有 自己的程序计数器,栈区域
4. 什么是任务队列?
任务队列(task queue)主要分两种:
1、宏任务(macrotask):在新标准中叫 task
1.1)主要包括:script(整体代码),setTimeout,setInterval,setImmediate,I/O, ui rendering
2、微任务(microtask):在新标准中叫 jobs
2.1)主要包括:process.nextTick, Promise,MutationObserver(html5 新特性)
3、扩展:
3.1)同步任务:在主线程上,排队执行的任务,只有前一个任务执行完毕,才能执 行后一个任务
3.2)异步任务:不进入主线程,而进入“任务队列”的任务,只有“任务队列” 通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行
5. 栈和队列的区别?
1、栈的插入和删除操作都是在一端进行的,而队列的操作却是在两端进行的
2、队列先进先出,栈先进后出
3、栈只允许在一端进行插入和删除,而队列允许在一端进行插入,在另一端进行删除#
6. 栈和堆的区别?
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
堆 区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收
2、堆(数据结构):堆可以被看成是一棵树,如:堆排序;
栈(数据结构):一种先进后 出的数据结构