老司机带你秒懂内存管理 - 第一部(共三部)

要理解为什么将 ArrayBuffer 和 SharedArrayBuffer 添加到 JavaScript 中,你需要了解一些关于内存管理的内容。

你可以将机器中的内存看作一堆盒子。就像你在办公室里的邮箱,或是小孩子们使用的收纳箱。

如果你想要为其他孩子留下一些东西,你可以把它放在一个盒子里。

在每个盒子旁边都有一个数字,这些数字就是内存地址,用来告诉别人在哪里找到你留给他们的东西。

这些盒子中的每一个都具有相同的尺寸,并且可以容纳一定量的信息。盒子的尺寸取决于机器。这个大小称为字长。它通常是32位或64位。但是为了显示方便,这里我们使用8位字长。

如果我们想把数字2放在其中一个盒子中,我们可以很容易地做到这一点。数字很容易转换成二进制

如果我们想要的东西不是数字怎么办?比如字母 H?

我们需要一个类似UTF-8的编码来用数字代替这些东西。而为了把这些东西转换成数字,我们需要一个类似编码器环的工具。之后我们就可以存储它了。

当我们想把它从盒子里拿出来的时候,必须通过解码器把它转换回 H。

自动内存管理

当你在使用 JavaScript 时,实际上并不需要考虑内存。内存被抽象出来,你不会直接接触到它。

取而代之的是 JS 引擎充当中介,为你管理内存。

比如说有一段 JS 代码用来创建一个变量(假设该 JS 代码使用了 React)。

JS 引擎利用编码器把该值转换成二进制。

它将在内存中找到可以容纳该二进制的空间,这个过程称为分配内存。

然后,引擎将跟踪该变量是否仍然可以从程序中的任何地方访问。如果该变量无法再访问,以便 JS 引擎可以在回收的内存中存放新的值。

这种在内存中监控变量(字符串、对象或其他类型)并释放掉不再使用的变量所占用的内存的过程,称为垃圾回收。

像 JavaScript 这样不直接处理内存的语言被称为内存管理语言。

这种自动内存管理可以使开发人员更轻松。但它也增加了一些开销,而这种开销有时会使性能不可预测。

手动内存管理

和自动管理内存的语言相比,需要手动管理内存的语言有些不同。例如,我们来看看 React 如何使用 C 语言写入内存(现在可以通过WebAssembly实现)。

C 语言没有 JavaScript 在内存上的抽象层。而是直接在内存上运行。你可以从内存加载东西,也可以将内容存储到内存中。

当你将 C 语言或其他语言编译到 WebAssembly 时,你使用的工具将在 WebAssembly 中添加一些辅助代码。例如,它会添加用于编码和解码字节的代码。这些代码称为运行环境。运行环境会处理一些本该 JS 引擎做的事情。

但是对于手动管理的语言,其运行时将不包括垃圾回收。

这并不意味着你完全要自己处理。即使在手动内存管理的语言中,通常会从语言运行时获得一些帮助。例如,在 C 语言中,运行时会把哪些内存地址可用记录在一张表中,这张表叫做空闲列表。

你可以使用函数 malloc (内存分配的简写)来申请一些可以容纳数据的内存地址。这将把这些地址从空闲列表中拿走。当你处理完这些数据后,你须调用函数 free 释放掉由 malloc 函数申请的内存。之后,这些地址将被添加回空闲列表。

你必须弄清楚何时调用这些函数。这就是为什么它被称为手动内存管理——你得自己管理内存。

作为一名开发人员,弄清楚何时清除不同部分的内存可能很难。如果你在错误的时间进行操作,可能会出现bug,甚至导致安全漏洞。如果你不这样做,你的内存就会耗尽。

这就是为什么许多现代语言使用自动内存管理的原因——避免人为错误。但这是以性能为代价的。 我将在下一篇文章中更多地解释这一点。

(0)

相关推荐

  • 一文带你了解如何排查内存泄漏导致的页面卡顿现象

    "脚本之家 ",与百万开发者在一起 作者 | 零一0101 来源 | 前端印象(ID: Lpyexplore) 不知道在座的各位有没有被问到过这样一个问题:如果页面卡顿,你觉得可能 ...

  • 内存为什么还有管理?

    本文作者:度白嵌入式 任何程序运行起来都需要分配内存空间存放该进程的资源信息的,C程序也不例外.C程序中的变量.常量.函数.代码等等的信息所存放的区域都有所不同,不同的区域又有不同的特性.C语言学习者 ...

  • C语言变量作用域以及栈,堆困惑!!!!

    https://m.toutiao.com/is/Jn8m7wr/ 这几天遇到一段很困惑的代码.用函数内部变量地址做返回值时候,没法正确返回变量a地址,返回的是OX0如下: 我在函数内部再加一个指针q ...

  • 推荐!Python十大经典面试题!

    学完Python找工作期间,肯定会涉及到各种各样的面试题,本文小编为大家总结十个Python中最常见的面试问题,希望能够帮助到你. Python的主要功能是什么? Python是一种解释型语言,与C语 ...

  • 老司机带你系统性了解YANMAR6EY18(A)LW副机的维护管理要点

    一.引言 YANMAR 6EY18(A)L(W)柴油机是在船舶应用较为广泛的四冲程中高增压柴油机,众多船舶配备该型副机.从使用情况来看,该设备短时间内变得排烟温度较高,吃负荷能力差,工况普遍不尽人意. ...

  • 每日口语| 老司机带你飙“车”

    GRE备考指南 2018/12/05 +关注 收听 每日口语| 老司机带你飙"车" 应微信网友Leo的要求,简单说说汽车相关的英文,我是个车迷,会经常和大家分享汽车方面的英文,今天 ...

  • 老司机带你使用ImageJ高效分析图片

    解螺旋公众号·陪伴你科研的第2566天 图片高效分析 ImageJ(https://imagej.nih.gov/ij/)是免费开源的图像处理软件,在生物.医学中得到了广泛的使用.俗话说时间就是金钱, ...

  • 景观大道G318川藏线与天路青藏线的碰撞!西藏老司机带你穿越西藏~~

    一直以来,西藏在人们心中是一个神圣的地方,尤其是到西藏东南的川藏线上走一遭,更是很多人梦寐以求的梦想.川藏线即成都-拉萨公路,东起四川省会成都市,西止西藏首府拉萨市,分为南北线,是中国最险峻的公路. ...

  • 重庆各大商圈停车攻略!老司机带你不排队免费停

    停车难,成了每个人心中出行的一座大山!本来高高兴兴出门,结果花在路上找车位都要耽搁很长时间.渐渐的,很多人对开车去商圈,都产生了恐惧心理.特别在重庆,魔幻的地形,停车更是难上加难. 今天,直接来干货! ...

  • 老司机带你分析书法字帖

    很多书法爱好者困惑书法字帖怎么看,我们找了一些对于书法碑帖单子分析的图片,四个字--注意细节.

  • 10天3991公里,集合超多藏地人迹罕至的风光!老司机带你走世界纪录认证的拉力赛穿越线!

    -这 是 自 驾 地 理 的 第 189 篇 原 创 路 书- 线路简介 路线里程:约3991公里 行程节点:兰州-久治-玉树-杂多-丁青-萨普神山-嘉黎-林芝-泽当-洛扎-拉萨 旅程用时:推荐10天 ...

  • 超搞笑!老司机带你全面认识基站

    认识基站 作为数量最多的移动通信设备 基站几乎是随处可见 可是,基站分为很多种 基站的天线,也分为很多种 真正都能区分清楚的人 其实不多 ▼请想象一下这个场景▼ 当你和女(男)票手挽手走在路上 (前提 ...

  • 车险到底怎么买,怎么赔?老司机带带你

    财产险是深蓝君一直不敢涉猎的地方,毕竟隔行如隔山,我能把人身险用大白话说清楚,已经很不容易了. 但是随着我对车险的关注,我发现很多人就算买了车险,仍然会发生各种各样的问题,甚至有很大的隐患. 所以深蓝 ...