Osk*_*ard 30 javascript safari memory-leaks image mobile-safari
更新了10/21:更改了标题和问题,以便可能得到答案(除了"否").
我们在Safari中遇到了泄漏(在Windows和Mac中确认,在iOS中被怀疑). 是否有任何Safari扩展允许一个配置文件JavaScript/DOM内存使用来发现潜在的泄漏?更好的是,有没有可以在iOS或Apple iOS模拟器上使用的工具?在Safari中发现可能导致JavaScript/DOM内存泄漏的建议技术是什么?有没有人知道任何访问iOS内存信息的方法?
背景
我们正在开发一个使用单页应用程序范例的iOS Safari Web应用程序,加载100个全屏图像.我们通过重置图像标签的源来实现正常的6.5 MB iOS Safari图像限制,但现在我们遇到了我认为iOS Safari中的内存泄漏.加载~250-300图像后,iOS Safari只会停止加载图像,因为我们怀疑是内存泄漏.不出意外,因为Safari for Windows和Safari for Mac都出现了同样的泄漏 - 在Windows上它特别糟糕; 对于每个新的全屏高分辨率图像,消耗另外10-15 MB的内存,如果我们切换到较低分辨率的图像,它仍然吞噬每个图像约5 MB.
在Windows中,我们将泄漏分离为在浏览器视口中渲染图像的简单行为 - 我们有一个图像轮播,即使没有DOM操作,只需通过视口转换(3d)图像,就可以分配内存并且从未发布过.在Windows上,内存消耗可以迅速升级到大约1.5 GB,此时Safari只会崩溃.在Mac上它并没有那么糟糕,但是内存很容易从一开始的100 MB跳到500 MB以上.相比之下,托管同一页面的Chrome标签/进程从大约33MB增长到大约120MB,然后稳定下来.
尝试过的变通方法
我们尝试删除单个图像标记并用占位符图像替换它们而不是重置它们,但这似乎不能缓解问题,并且还会导致性能问题,可能是由于DOM流失.有趣的是,删除/分离所有图像确实有效 - 一旦命令执行,内存就会被释放.然而,这会导致其自身的问题,管理UI状态,并且构建回车的过程也需要相当长的时间.刷新页面是另一种解决方法,但这会导致更多的UX中断.
更新04/10: 只是关于我们最终做的更新:iOS 4.2引入了一个限制,可以在122,900像素处截断3D转换的Div.不知道为什么,但它迫使我们重新设计并使用动态旋转木马而不是之前的静态幻灯片.
其次,我们发现使用带背景图像的div比图像本身效果更好.这似乎是Safari中的另一个错误,或者充其量是一个不一致的限制实现.
结束更新
思考?如果您在Safari中遇到了疑似泄漏,您的解决方法是什么?
小智 37
安装iOS SDK时,还会安装名为Instruments的实用程序.它可以跟踪各种使用统计数据,包括内存(甚至还有"泄漏"模板).最棒的是,它可以跟踪iPhone/iPad模拟器和任何连接的iOS开发设备.当然,它也可用于监视Mac OS中的内存使用情况,因此它也可以帮助Safari.您可以在/ Developer/Applications中找到Instruments.
其他方便的是,每当您将iPad/iPhone与iTunes同步时,它还会将设备的任何崩溃报告同步到您的计算机.它们可以在〜/ Library/Logs/CrashReporter/MobileDevice/[Device Name] /中找到.
我们在为iPad开发时发现的一件事是,由于内存问题,它很容易崩溃,特别是像我们这样的图像繁重的应用程序.我们学到的一件事是,删除DOM元素并不意味着该元素将被浏览器垃圾收集.我们发现将图像src(或背景图像,如果它是div)设置为空字符串,然后将其从DOM中删除有助于极大地帮助它.
不确定是否有任何帮助,但希望启动和运行仪器将使您更好地了解所有内存的去向.