2012-12-12 62 views
0

一旦運行我的代碼,我得到: this什麼可能導致在我的JavaScript大量記憶峯值?

不斷峯值4和12MB之間多次一秒。

Here is the full thing.

我已經收窄至有可能在抽籤()函數或settarget()函數,但我想不出是什麼原因導致這麼多垃圾。

This is the code

什麼有可能是造成這麼多的垃圾?

+0

看看這個腳本有多少個''for's? –

+1

我在控制檯中至少得到10個錯誤,也許你應該首先檢查它們。 – mpm

+0

適合我。 @camus - 你在Chrome中運行嗎? – broofa

回答

1

從我可以使用Chrome's Heap Profiler中收集的信息看起來像是在創建大量的數組,數字和字符串。 (並不奇怪這樣一個動畫。)這行看起來可疑對我說:

rgbcolor = 'rgb('+Math.floor(Math.random()*256)+','+Math.floor(Math.random()*256)+','+Math.floor(Math.random()*256)+')'; 

這就是所謂的每一幀上的每個點,並創建(至少)一個新的String對象,再加上各種號碼相關數學在底層做的東西。

這就是說,這是否會給您帶來實際問題,還是隻是鋸齒形內存配置文件正在擾亂您?這種內存配置文件對於垃圾收集運行時並不罕見,並且鋸齒形峯值不隨時間增加的事實似乎表明您實際上沒有任何內存泄漏。而且,Chrome(以及大多數現代瀏覽器)也非常擅長優化創建類似這樣的瞬態對象的代碼。

+0

對我來說沒有任何實際問題,我只是覺得12MB內存使用率的峯值似乎很高。然後再次,也許不是。 此外,我拿出了與顏色相關的代碼行,並將其設置爲#fff,並且鋸齒圖案保持不變。 –

+0

FWIW,它看起來像垃圾收集器只負責〜1%的CPU(使用配置文件 - > CPU配置文件工具) – broofa

+0

好吧,我從來沒有真正理解配置文件工具。那麼因爲內存不會隨着時間的推移而增加,所以我認爲這不是一個大問題。現在最主要的是它總共使用了我CPU的80%來運行它。這將有可能交給gpu嗎? –

0

其實,我覺得它這條線的位置:

window.setTimeout(callback, 1000/60);. 

如果您在控制檯工具看詳情Memory下,你會看到的動畫幀被解僱,然後再燒製,然後再 - 發生每個17ms正好是1000/60四捨五入。

您可以打開初始調用:

(function animloop() { 
window.requestAnimFrame(animloop); 

而且你會看到每一個17ms後,你的過程中再次催生本身。

+1

這與內存消耗有什麼關係? – broofa

+0

@broofa這與內存消耗無關嗎?每次它產生這個過程時,它都會請求動畫幀 - 它有數百個元素。任何時候你產生任何進程將消耗內存... – Ryan

+0

是的,但這是整個事情,動畫的點。它本質上是一個間隔計時器,你會怎麼做? –

相關問題