【发布时间】:2014-11-23 05:21:53
【问题描述】:
我有一个 PhoneGap 应用程序。一个 HTML5 画布游戏。它似乎在 iOS 8(包括 8.0.2)中比 iOS 7 使用了更多的内存。
除了使用更多内存之外,JS 垃圾收集器似乎永远不会释放它所持有的内存。它正确地收集“释放”的内存,但从未将其释放回供 iOS 使用。
这是在 iOS 7 和 iPhone 5S 下使用 Instruments Allocations 的内存使用情况。正如你所看到的,当我加载和卸载一个关卡时它会上下波动。内存使用率也很低,大约 23mb,最大 41.81mb
这是在装有 iOS 8.0.2 的 iPhone 5S 上运行的同一个应用程序。如您所见,内存使用量永远不会下降,它使用的内存要多得多。事实上,当我加载和卸载同一级别时,内存使用量会一直上升。它没有上升那么高,这让我认为 JS 正确地重用了垃圾收集器中的内存,但是 GC 似乎从来没有释放它保留给操作系统的内存。此外,整个应用程序似乎比以前使用了更多的内存。
该应用程序的运行速度也慢了很多,在我停止它时达到了 121mb。
我应该补充一点,在卸载关卡时我会重新加载页面,奇怪的是在 iOS 8 下这并没有释放任何内存。
有没有人知道可能导致此问题的原因以及解决方案可能是什么?这是 iOS 8 中的错误吗?
在 8.0(但不是 8.1)中,可以使用解决方法/hack 来释放:在使用 window.location.href = 强制重新加载页面之前调用 window.location.reload(true);。从 8.1 开始,这个 hack/workaround 不起作用。
【问题讨论】:
-
可能与此问题有关(或相同):issues.apache.org/jira/browse/CB-8002 如果可以,请检查一下,如果这可能是同一个问题,请告诉我们。如果是这样,我认为有可用的补丁版本(请参阅 jira 票证中的注释)。