繁体   English   中英

在SAPUI5 / OpenUI5中创建和删除视图时发生内存泄漏

[英]Memory leak when creating and deleting views in SAPUI5/OpenUI5

我正在使用OpenUI5 / SAPUI5编写测试应用程序,即使经过大量测试,优化和研究,我似乎仍然存在内存泄漏。

我有几个附加了控制器的视图,并使用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函数中手动添加了对其元素的destroy调用(销毁视图时调用onExit)。 即使对视图的销毁调用也应销毁其子级,但这似乎摆脱了更多元素,但仍然不够。 我仅使用SAPUI5提供的事件和单击处理程序,这些事件和调用处理程序应在调用destroy时分离,并且如果视图已订阅我在onExit中取消订阅的事件。

问题:

如果创建并导航到新视图,然后返回(销毁视图),则似乎只有大约一半的分配内存被释放。 因此,例如,我将打开一个视图,返回并在Chrome中拍摄一个堆快照,该快照显示了20MB。 然后,我打开和关闭同一视图5次,最终得到20.5 MB。 因此,对于该特定视图,销毁它时不会删除100KB。 如果应用全天(按预期使用),则可能会在较旧的移动设备上引起问题。 有没有人有这个问题的经验? 非常感谢你。

编辑

我用Chrome时间轴记录了内存使用情况。 我反复创建了两个视图并再次销毁了它们。 对于JS堆,我得到以下结果:

在此处输入图片说明

因此,随着时间的流逝,它似乎在大量增长。

对于节点和侦听器,我得到了这个结果,对我来说似乎可以:

在此处输入图片说明

您是说这是内存泄漏还是我反应过度? 此测试是否可靠? 非常感谢你。

浏览器保留内存是正常的。 JavaScript是一种垃圾收集语言,因此取消对象引用或使用delete键盘不会触发垃圾收集器释放该内存。

现代浏览器中的内存垃圾回收通常分为两个阶段:

  1. 检查对象图。 任何未被“全局上下文”引用的对象,例如浏览器中的window对象,都被标记为“陈旧”。

  2. 下次运行垃圾回收器时,所有先前“过时”的对象都将释放其内存,并返回给浏览器使用,以供浏览器使用-请注意,从操作系统的角度来看,不会“释放”该内存。 浏览器保留这些内存地址,以防再次需要它们。

  3. 释放“陈旧的”对象后,浏览器将再次返回到步骤1,以将下一批对象标记为“陈旧的”。

此外,大多数浏览器仅允许垃圾收集器运行一定的毫秒数,因为在这段时间内,浏览器中的UI在技术上无响应,因此被检查的对象图不会在运行中期发生变化。

内存泄漏的真正测试是利用内置的浏览器工具进行内存分析。 我知道Chrome和Firefox具有此功能。 其次,随着时间的推移-我的意思是超过10到15分钟-您应该看到分配给浏览器的内存出现锯齿状,短期趋势是上下波动的,但总体趋势是平稳的。

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

如果您看到随时间变化的锯齿图案,总体趋势是上升,则可能表示内存泄漏。

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

真正的测试是使用浏览器附带的内置性能监视工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM