跳到主内容

浏览器基础面试题(三)

浏览器存储 cookies、sessionStorage、localStorage 和 indexDB 的区别

  • cookie 是为了识别用户身份而储存在浏览器本地的数据,大小不超过 4k,在同源请求上在请求头上会携带,跨域请求需要设置 withCredentials = true
  • sessionStoragelocalStorage 也可以存储在浏览器本地,通常大小约 5m(不同浏览器机制不一样),为了兼容,使用时候尽量不要超过 5m,不会主动随着请求发送到服务器。
  • indexDB 是浏览器数据库,无大小限制,也不会主动随着请求发送到服务器。
  • cookie 可以在配置的有效期范围内有效,sessionStorage 在浏览器的单个标签会话内有效,浏览器关闭后主动清理,localStorage 持久化存储,除非手动清理。

垃圾回收机制,工作流程

GC 是什么

GC(Garbage Collection 垃圾回收),在我们的程序运行过程中会产生很多垃圾,这些垃圾可能是程序不用的内存或者是之前使用过以后不需要再使用的内存空间,而 GC 就是负责回收垃圾的,也就是我们常说的垃圾回收收机制

垃圾产生

我们在写代码时,声明的变量、对象等等都是需要占用内存的。而不同的类型的数据是保存到不同的内存中的。

  • 基本数据类型占用空间小、大小固定,通过值来访问,属于被频繁使用的数据。所有保存在栈内存
  • 引用数据类型(ArrayFunctionObject)时存储在堆内存中,引用数据类型占据空间大、大小不固定,如果存储在栈中非常影响程序的性能。

对于引用数据类型,在栈内存的变量名中保存了一个地址,这个地址指向堆内存中的实际值。如果一个对象被重新赋值,与原来的对象数据之间不存在了引用关系,这个时候就是无用的对象,为了不影响系统性能,所以这个无用的对象就需要被垃圾回收。

垃圾回收的方法

在 JavaScript 内存管理中有一个概念叫做 可达性,就是那些以某种方式可访问或者说可用的值,它们被保证存储在内存中,反之不可访问则需回收。

JavaScript 垃圾回收机制的原理说白了也就是定期找出那些不再用到的内存(变量),然后释放其内存,一般有以下两种方法。

  • 标记清除算法
  • 引用计数算法

标记清除算法

目前在 JavaScript 引擎里这种算法是最常用的,到目前为止的大多数浏览器的 JavaScript 引擎都在采用标记清除算法。

整个标记清除算法大致过程就像下面这样

  • 垃圾收集器在运行时会给内存中的所有变量都加上一个标记,假设内存中所有对象都是垃圾,全标记为 0
  • 然后从各个根对象开始遍历,把不是垃圾的节点改成 1
  • 清理所有标记为 0 的垃圾,销毁并回收它们所占用的内存空间
  • 最后,把所有内存中对象标记修改为 0,等待下一轮垃圾回收

引用计数算法

它的策略是跟踪记录每个变量值被使用的次数。目前很少使用这种算法了,因为它的问题很多。

引用计数的缺点想必大家也都很明朗了,首先它需要一个计数器,而此计数器需要占很大的位置,因为我们也不知道被引用数量的上限,还有就是无法解决循环引用无法回收的问题,这也是最严重的。

更详细的垃圾回收细节可以查阅这篇文章