iOS:由于内存不足导致浏览器崩溃

Mar*_*iev 15 html javascript memory-leaks google-chrome ios

由于iOS上的内存不足,我的网站在浏览器中崩溃.我正在重复一些消耗记忆的动作.经过多次尝试,浏览器崩溃了.但是,当我使用开发工具中的timelime使用Chrome在我的桌面上测试同一个网站时:

  1. 执行相同的操作
  2. 收集垃圾
  3. 收集所有额外分配的内存.

如果没有内存泄漏,为什么浏览器会崩溃?有没有办法强制垃圾收集?

Dur*_*n.H 25

了解iOS资源限制

您的网页在桌面上运行良好并不能保证它在iOS上运行良好.

1.请记住iOS使用

  • EDGE(带宽更低,延迟更高)
  • 3G(更高的带宽,更高的延迟)
  • Wi-Fi(更高带宽,更低延迟)

连接到Internet.

2.您需要最小化网页的大小.包含

  • 未使用或不必要的图像
  • CSS
  • JavaScript的

这会对您网站在iOS上的表现产生负面影响.

3.由于iOS上可用的内存,它可以处理的资源数量有限:

已解码的GIF,PNG和TIFF图像的最大大小

  • 3百万像素,适用于RAM低于256 MB的设备
  • 500万像素,适用于RAM大于或等于256 MB的设备

对于RAM小于256 MB的设备,这确保宽度*高度≤3*1024*1024

注意:解码后的大小远远大于图像的编码大小.

使用子采样,JPEG 的最大解码图像尺寸为 3200万像素.由于子采样,JPEG图像可以达到3200万像素,这使得JPEG图像可以解码为像素数量的十六分之一.大于2百万像素的 JPEG图像 被二次采样 - 即,解码为缩小的尺寸.JPEG子采样允许用户查看来自最新数码相机的图像.

4. canvas元素的最大大小

  • 3百万像素,适用于RAM低于256 MB的设备
  • 500万像素,适用于RAM大于或等于256 MB的设备.如果未指定,画布对象的高度和宽度为150 x 300像素.

5. JavaScript执行时间

每个顶级入口点限制为10秒.如果您的脚本执行时间超过10秒,则iOS上的Safari会停止在代码中的随机位置执行脚本,从而可能导致意外后果.

6. 一次可以打开的文件的最大数量

  • 在iPhone上有八个

  • 在iPad上有九个.

有关详细信息,请参阅开发Web内容以获取Safari-Apple文档.

垃圾收集

移动safari javascript实现没有像Internet Explorer中的CollectGarbage()那样的命令用于垃圾收集.

三个事件触发移动safari中的垃圾收集(参考).

  • 专用垃圾收集计时器到期
  • 当所有堆的CollectorBlocks都已满时,就会发生分配.
  • 分配具有足够大的关联存储的对象.

触发垃圾收集真的是一种不好的做法.我们应该做的是编写不泄漏内存的代码.

请参阅Javascript中的内存管理


ami*_*ena 5

以下是我见过的最好的资源(带有基准测试),对此进行了解释:http : //sealedabstract.com/rants/why-mobile-web-apps-are-slow/

几周前,我遇到了这些性能障碍,请注意,iOS没有任何默认垃圾回收(本文解释了原因)。这是应用程序(在本例中为浏览器应用程序)的责任。您无法通过Web应用程序收集垃圾。为iOS优化网站(防止崩溃)时的一个小技巧:避免CSS转换。

尽管我建议您喝杯咖啡并阅读全文,但我将在下面粘贴摘要:

  • Javascript太慢,无法在2013年用于移动应用程序(例如,用于照片编辑等)。
    • 比本地代码慢大约5倍
    • 相当于IE8
    • 比x86 C / C ++慢50倍
    • 如果您的程序适合35MB,则它比服务器端Java / Ruby / Python / C#慢10倍左右,并且从那里呈指数级下降
  • 要使其更快,最可行的方法是将硬件推向桌面级性能。从长远来看,这可能是可行的,但看起来却是一个漫长的等待。
  • 目前,语言本身似乎并没有变得越来越快,并且正在使用它的人们都说,使用当前的语言和API,它永远不会像本机代码一样快
  • 在内存受限的环境中,垃圾回收成指数增长。它的方式要比台式机或服务器级环境差。
  • 每个有能力的移动开发人员,无论是否使用GC环境,都花费大量时间考虑目标设备的内存性能
  • 目前存在的JavaScript从根本上反对甚至允许开发人员考虑目标设备的内存性能。
  • 如果他们确实改变了主意并允许开发人员考虑内存,经验表明这是一个技术难题。