0%

JavaScript 核心 (8) - 執行環境與作用域 - 回收機制

回收機制 Garbage Collection

又稱 垃圾回收,回收機制是一個自動化記憶體管理機制,舉凡宣告變數、執行函式這些都會占用記憶體空間,若沒有固定清理這些暫存記憶體,很快就會沒有空間可以繼續利用,進而導致網頁 lag 不順等等狀況。

JS 的回收機制

回收機制是指 「當物件不再被使用或是不再被其他物件參考時」,它才會被視為一個可回收的記憶體。
而在先前有說過 JS 有所謂的執行推疊,並且由後往前釋放,而當中就會將其函式所占用的記憶體一併回收。
以下舉例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 隨機生成很長的字串來佔用記憶體 */
function randomString(length) {
var result = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for (var i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}


/* demoData 將持續占用記憶體空間 */
var demoData = [];
function getData() {
for (let i = 0; i < 1000; i++) {
demoData.push(randomString(5000));
}
}
getData();
console.log(demoData);

Memory 中查看占用狀況
記憶體占用

即使是清掉 console.log 也依舊有很高的佔比。
將上面的函式修改成以下後再執行一次

1
2
3
4
5
6
7
8
function getData() {
var demoData = [];
for (var i = 0; i < 1000; i++) {
demoData.push(randomString(5000))
}
// console.log(demoData);
}
getData()

記憶體占用

由此可知,在一開始時記憶體占用確實很高沒錯,但隨後因為回收機制的關係,demoData不再被參考或使用,就會釋放記憶體空間

參考資料

六角學院 - JavaScript 核心篇
JavaScript 核心觀念(8)-執行環境與作用域-記憶體存放與釋放