2015-10-09 21 views
2

我使用OpenUI5/SAPUI5編寫測試應用程序,甚至在經過大量測試,優化和研究之後,我似乎仍然有內存泄漏。在SAPUI5/OpenUI5中創建和刪除視圖時發生內存泄漏

我有一個控制器連接到它的幾個視圖,並使用SAPUI5的SplitApp控件在它們之間導航。每當我導航回到我摧毀這樣的觀點:

// Get current page 
var sCurrentDetailPage = this.oSpiltApp.getCurrentDetailPage().getId(); 
// Go back 
this.oSpiltApp.backDetail(); 
this.oSpiltApp.removeDetailPage(sCurrentDetailPage); 
// Destroy current page 
sap.ui.getCore().byId(sCurrentDetailPage).destroy(true); 

因爲我無法擺脫的所有視圖保持我手動添加摧毀它們在控制器的OnExit函數調用的元素內容(的OnExit是在銷燬視圖時調用)。儘管對視圖的摧毀呼喚也應該摧毀其子女,但這似乎擺脫了更多元素,但仍然不夠。 我只使用SAPUI5提供的事件並單擊處理程序,當調用destroy時應該將其分離,並且如果視圖訂閱了我在onExit中取消訂閱的事件。

問題:

如果我創建並導航到一個新的視圖,然後回去(破壞視圖)只有大約一半分配的內存似乎再次釋放。所以我會舉個例子,例如打開一個視圖,回過頭來看看Chrome中的堆快照,它顯示了20MB。然後我打開並關閉相同的視圖5次,最終以20.5 MB。因此,對於這個特定的視圖,銷燬它時不會刪除100KB。如果應用程序在整個使用過程中(它應該是這樣),這可能會導致舊的移動設備出現問題。 有沒有人有這個問題的經驗?非常感謝你。

編輯

我記錄與Chrome的時間軸中的內存使用。我反覆創造了兩個觀點並再次摧毀它們。對於JS堆我得到了以下結果:

enter image description here

所以它似乎隨着時間的推移大規模增長。

對於節點和聽衆我得到這個結果,這似乎是確定對我說:

enter image description here

你會說這是內存泄漏還是我反應過度?這個測試是否可靠?非常感謝你。

+0

我注意到以下問題:http://stackoverflow.com/questions/33257288/how-remove-no-longer-used-odata-bindings-in-sapui5所以可能是你有類似的問題? – user3783327

+0

@ user3783327感謝您的輸入。在我看來,即使沒有數據加載,視圖在被銷燬後仍然佔用大約150KB。所以這不僅僅是我的問題的數據。但是當我嘗試刪除它時,我會檢查數據會發生什麼。 – Ben

回答

4

瀏覽器持續記憶是正常的。 JavaScript是一種垃圾收集語言,因此無效的對象引用或使用delete鍵盤不會觸發垃圾回收器來釋放該內存。在現代瀏覽器

存儲器垃圾收集通常發生在兩個階段:

  1. 對象圖進行檢查。任何未被「全局上下文」中的任何內容引用的對象,例如瀏覽器中的window對象被標記爲「陳舊」。

  2. 垃圾回收器下一次運行時,所有先前「過時」的對象都會釋放內存並將其返回供瀏覽器使用 - 請注意,從操作系統的角度來看,此內存不是「釋放」的。瀏覽器會保留這些內存地址,以防再次需要它們。

  3. 釋放「過時」對象後,瀏覽器再次返回到步驟#1以將下一批對象標記爲「過時」。

此外,大多數瀏覽器只允許垃圾回收器的毫秒數集運行,因爲在此期間,在瀏覽器的UI在技術上無響應,從而被檢查對象圖不發生變異中旬跑。

內存泄漏的真正測試是利用內置的瀏覽器工具進行內存分析。我知道Chrome和Firefox有這個功能。其次,隨着時間的推移 - 我的意思是超過10到15分鐘 - 你應該看到分配給瀏覽器的內存的鋸齒圖案,短期趨勢是上下的,但整體趨勢是平坦的。

 .  .  .  .  . 
    . | . | . | . | . | 
    . | . | . | . | . | 
.  |.  |.  |.  |.  | 

如果你看到隨着時間的推移鋸齒圖案,其中總的趨勢是向上的,那麼可以表示內存泄漏。

        . 
         .  . | 
       .  . | . | 
     .  . | . | .  | 
    . | . | .  |.  
    . | .  |.  
.  |. 

真的是真正的測試是使用隨瀏覽器一起提供的內置性能監控工具。

+0

非常感謝您的回答。如果我理解正確,我不應該在Chrome中使用堆快照,因爲如果內存被釋放,它不會顯示我。所以更好的工具可能是Chrome開發人員工具中的時間線,這是否正確? 我使用一些顯示時間線的截圖更新了我的初始文章。這很酷,如果你可以看看它。再次感謝 :-) – Ben