要理解为何将 ArrayBuffer 和 SharedArrayBuffer 添加到 JavaScript 中,你须要了解一些关于内存管理的内容。前端
你能够将机器中的内存看做一堆盒子。就像你在办公室里的邮箱,或是小孩子们使用的收纳箱。web
若是你想要为其余孩子留下一些东西,你能够把它放在一个盒子里。安全
在每一个盒子旁边都有一个数字,这些数字就是内存地址,用来告诉别人在哪里找到你留给他们的东西。函数
这些盒子中的每个都具备相同的尺寸,而且能够容纳必定量的信息。盒子的尺寸取决于机器。这个大小称为字长。它一般是32位或64位。可是为了显示方便,这里咱们使用8位字长。工具
若是咱们想把数字2放在其中一个盒子中,咱们能够很容易地作到这一点。数字很容易转换成二进制。性能
若是咱们想要的东西不是数字怎么办?好比字母 H?编码
咱们须要一个相似UTF-8的编码来用数字代替这些东西。而为了把这些东西转换成数字,咱们须要一个相似编码器环的工具。以后咱们就能够存储它了。3d
当咱们想把它从盒子里拿出来的时候,必须经过解码器把它转换回 H。code
当你在使用 JavaScript 时,实际上并不须要考虑内存。内存被抽象出来,你不会直接接触到它。cdn
取而代之的是 JS 引擎充当中介,为你管理内存。
好比说有一段 JS 代码用来建立一个变量(假设该 JS 代码使用了 React)。
JS 引擎利用编码器把该值转换成二进制。
它将在内存中找到能够容纳该二进制的空间,这个过程称为分配内存。
而后,引擎将跟踪该变量是否仍然能够从程序中的任何地方访问。若是该变量没法再访问,以便 JS 引擎能够在回收的内存中存放新的值。
这种在内存中监控变量(字符串、对象或其余类型)并释放掉再也不使用的变量所占用的内存的过程,称为垃圾回收。
像 JavaScript 这样不直接处理内存的语言被称为内存管理语言。
这种自动内存管理可使开发人员更轻松。但它也增长了一些开销,而这种开销有时会使性能不可预测。
和自动管理内存的语言相比,须要手动管理内存的语言有些不一样。例如,咱们来看看 React 如何使用 C 语言写入内存(如今能够经过WebAssembly来实现)。
C 语言没有 JavaScript 在内存上的抽象层。而是直接在内存上运行。你能够从内存加载东西,也能够将内容存储到内存中。
当你将 C 语言或其余语言编译到 WebAssembly 时,你使用的工具将在 WebAssembly 中添加一些辅助代码。例如,它会添加用于编码和解码字节的代码。这些代码称为运行环境。运行环境会处理一些本该 JS 引擎作的事情。
可是对于手动管理的语言,其运行时将不包括垃圾回收。
这并不意味着你彻底要本身处理。即便在手动内存管理的语言中,一般会从语言运行时得到一些帮助。例如,在 C 语言中,运行时会把哪些内存地址可用记录在一张表中,这张表叫作空闲列表。
你可使用函数 malloc
(内存分配的简写)来申请一些能够容纳数据的内存地址。这将把这些地址从空闲列表中拿走。当你处理完这些数据后,你须调用函数 free
释放掉由 malloc
函数申请的内存。以后,这些地址将被添加回空闲列表。
你必须弄清楚什么时候调用这些函数。这就是为何它被称为手动内存管理——你得本身管理内存。
做为一名开发人员,弄清楚什么时候清除不一样部分的内存可能很难。若是你在错误的时间进行操做,可能会出现bug,甚至致使安全漏洞。若是你不这样作,你的内存就会耗尽。
这就是为何许多现代语言使用自动内存管理的缘由——避免人为错误。但这是以性能为代价的。 我将在下一篇文章中更多地解释这一点。
iKcamp原创新书《移动Web前端高效开发实战》已在亚马逊、京东、当当开售。