2015-10-09 27 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