2017-05-30 89 views
0

我在一個總損失和留下的感覺就像在一般使用2角爲構建真實世界的應用,由於周圍的內存使用的問題放棄了。角2,使用Javascript,內存使用情況和垃圾收集

我按照所有的像歸零所有屬性時不再需要,刪除所有對性能,排空陣列等,妥善解決的最佳編碼實踐倒閉等等等等等等等等...

這無論如何,當在Angular 2中測試一些非常基本的功能時,我會繼續在DOM的各種基本操作的運行期間遇到不斷增加的內存使用情況。

在執行過程中使用的內存大塊

只是一個例子,從來沒有得到垃圾回收:

動畫一個div隨時間的寬度。

我試圖以幾種不同的方式實現這種UI行爲,最有效的方法是使用requestAnimationFrame的間隔,並將其全部包裝在Angular的zone.runOutsideOfAngular方法中。無論如何,將下面一行放在循環中使用大量的內存,即使在使用cancelAnimationFrame正確取消循環後,循環內使用的nulling屬性以及對div的所有引用,並刪除來自DOM的div。

this.renderer.setStyle(this.progressBar.elRef.nativeElement.querySelector('.progress-inner'), 'width', percentProgress+'%'); 

正如我確信你可以告訴,這是從修改進度欄的寬度方法採取的一條線。再說一遍,我注意到我試過用幾種不同的方式實現一個進度條。使用CSS來製作動畫,而不是上面概述的方法。

總的來說,似乎不管我做什麼 - 無論我嘗試實現什麼,很多與動畫有關的動作 - 即使只是像滾動一樣,似乎都需要不斷增加的內存量在Angular 2應用程序中永遠不會收集垃圾。

因此,在短期,這篇文章是不特定於間隔,或動畫一個div的寬度。幾乎Angular 2應用程序內部的任何任務似乎都使用大量永遠不會垃圾收集的內存。

任何人都可以提供任何指導? 推薦一本關於內存使用和Javascript的書嗎?

它的確一直非常沮喪碰上,我一直的內存使用量的問題。推動我想放棄使用Angular 2。

+0

雖然這篇文章是爲角,但是你可以用你的應用程序相關的。這是[Link](https://medium.com/@rlucha/memory-management-in-angular-applications-12f05499b36d)。 –

回答

1

如果你使用的觀測量,然後確保你unsubscribe()給他們。不要將它們設置爲null。如果事實證明這是你的問題,那麼看看智能與表示組件。這是一個角度2的範例,在組件被銷燬後,垃圾收集的效果會有所改善。

在過去,我已經訂閱推到一個數組和退訂onDestroy

ngOnInit(){ 
    this.subs.push(this.myObservable.subscribe(/*logic*/)) 
} 

ngOnDestroy() { 
    for (let sub = 0; sub < this.subs.length; sub++) { 
    this.subs[sub].unsubscribe(); 
    } 
} 

還要考慮使用[ngStyle]="{'width': calculateWidth()}"調整元素的大小,爲你工作。剛在組件中定義了您的calculateWidth()邏輯並將轉換添加到您的樣式表中transition: width .4s cubic-bezier(.25, .8, .25, 1);

儘量避免renderer,存在安全問題。取而代之的是通過@Input()裝飾器將數據傳遞給子組件的思路。然後使用ngOnChangeschangeDetection: ChangeDetectionStrategy.OnPush來允許組件重新渲染。角快像和動畫仍然會呈現之間工作