2017-02-24 143 views
0

在下面的代碼中,我不認爲內存會不斷增加,但它根據chrome調試器的不同而增加。這段代碼爲什麼會導致內存泄漏?

在循環的中間,我等待10毫秒,這足以讓上一次超時完成。然而,內存似乎並沒有被釋放。這是爲什麼?

while (true) { 
    let giantArray = Array(100000).fill().map(() => Math.random()); 
    await new Promise((resolve) => setTimeout(resolve, 10)); 
    setTimeout(() => { 
     giantArray[3] = 3; // If I don't reference giantArray, there is no leak 
    }, 1); 
} 
+0

很難說出執行過程中究竟發生了什麼(GC是否足以快速移除閉包和清理數組?),但是這段代碼真的需要解決問題。 **從不**使用超時等待任務執行。 –

+0

「_I等待10毫秒,這足以讓上一次超時完成。」你爲什麼這麼想? – KarelG

+0

當我添加控制檯日誌時,我可以確認。內存泄漏仍然與console.log發生 – Karamell

回答

0

你有一個while-true循環;與第一條語句讀取:

while (true) { 
    let giantArray = Array(100000).fill().map(() => Math.random()); 

所以你在每次循環迭代創建一個新 giantArray。此後立即丟棄。你真的很驚訝,這會讓你陷入「內存不足」?

換句話說:事後並沒有什麼關係。你的代碼創建這個龐大的數組;填充它(!);把它扔掉。然後一次又一次地做同樣的事情。

所以即使垃圾收集在這裏也能正常工作(而且它不)。仍然有可能以如此高的速度創建垃圾回收器無法跟上!

+0

沒有setTimeout但仍然引用giantArray,內存泄漏不存在 – Karamell