iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
自我挑戰組

重新開始 JavaScript系列 第 9

[Day8] JavaScript 的記憶體回收機制

  • 分享至 

  • xImage
  •  

前一天提升章節中有提到,在執行環境中,會創造函式與變數的記憶體空間,但若這些記憶體一直不釋放,會造成記憶體滿載或導致效能變差等問題,所以要適時地釋放記憶體空間,所以下面來了解關於 JavaScript 記憶體的存放與釋放

執行環境與釋放

在執行函式時會產生執行環境,而執行環境是一層一層建立並堆疊執行,當運作完成則會一層一層離開,而當執行環境一層一層離開,同時也會釋放記憶體空間,最後僅留下全域執行環境所佔用的記憶體。

回收機制(Garbage collrction)

JavaScript 在大部分情況下採用 回收機制 來決定記憶體是否要回收,當一個物件,沒有任何物件參考它時,則會被視為記憶體的垃圾,因而被釋放,以下為課程中使用範例:

範例1

// 1.創造長字串來佔用記憶體空間
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;
}

// 2.建立空陣列 data
var data = [];

// 3.建立函式 getData - 將 randomString 產生的長字串放入陣列 data
function getData() {
  for (let i = 0; i < 1000; i++) {
    data.push(randomString(5000))
  }
}

// 4.運行函式 getData
getData();

// 5.顯示陣列 data
console.log(data);

範例2

// 1.創造長字串來佔用記憶體空間
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;
}

// 2.建立函式 getData
function getData() {
    // 2-1.在函式內建立空陣列 data
    var demoData = [];
    
    // 2-2.將 randomString 產生的長字串放入陣列 data
    for (var i = 0; i < 1000; i++) {
      demoData.push(randomString(5000))
    }
    
    // 2-3.顯示陣列 data
    console.log(demoData);
    // 注意:Chrome console 中的行為也會需要記憶體
}

// 3.運行函式 getData
getData();

參考文獻

六角學院 - JavaScript 核心篇

MDN - 記憶體管理

先上傳,撰寫中ing/images/emoticon/emoticon02.gif


上一篇
[Day7] 提升
下一篇
[Day10] ASI - 自動插入分號
系列文
重新開始 JavaScript32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言