要理解爲何將 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前端高效開發實戰》已在亞馬遜、京東、噹噹開售。