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

时间:2014-02-26 11:11:29

标签: javascript html ios google-chrome memory-leaks

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

  1. 执行相同的操作
  2. 收集垃圾
  3. 收集所有额外分配的内存。
  4. 如果没有内存泄漏,为什么浏览器会崩溃?有没有办法强制垃圾收集?

2 个答案:

答案 0 :(得分:24)

了解iOS资源限制

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

1.请记住iOS使用

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

连接到互联网。

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

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

会对您网站在iOS上的效果产生负面影响。

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

  

解码的 GIF,PNG和TIFF 图像的最大尺寸

     
      
  • 3百万像素适用于 256 MB RAM的设备
  •   对于大于或等于 256 MB RAM的设备
  • 5百万像素
  •   
     

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

     

注意:解码后的尺寸远远大于图像的编码尺寸。

     

JPEG的最大解码图像大小 32百万像素使用   二次抽样。因为,JPEG图像最高可达<3200万像素   子采样,允许JPEG图像解码为 1的大小   十六分之一像素数。 JPEG图像大于2百万像素   被二次采样 - 即,解码为缩小的尺寸。 JPEG子采样   允许用户查看最新数码相机的图像。

4. 画布元素的最大大小为

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

5. JavaScript执行时间

  每个顶级入口点的

限制为 10秒。如果你的脚本   执行超过10秒,iOS 上的Safari停止执行   脚本在代码中的随机位置,因此意外后果   可能会导致

6.可以一次打开的<​​em>最大文档数

  
      iPhone上的
  •   iPad上的
  •   

请参阅Developing Web Content for Safari-Apple Documentation了解详情。

垃圾收集

移动safari javascript实现没有任何命令,如Internet Explorer中的 CollectGarbage()用于垃圾回收。

  

三个事件触发垃圾回收   移动野生动物园Reference)。

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

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

请参阅Memory management in Javascript

答案 1 :(得分:5)

以下是我遇到过的最好的资源(带基准),它解释了: http://sealedabstract.com/rants/why-mobile-web-apps-are-slow/

几周后我遇到了那些性能障碍,请注意iOS没有任何默认垃圾收集(文章解释了原因)。它是应用程序的责任(在这种情况下,是浏览器应用程序)。您无法通过您的网络应用收集垃圾。为iOS优化您的网站(防止崩溃)的一个小小提示:避免CSS转换。

虽然我建议你喝一杯咖啡并阅读完整的文章,但我会在下面粘贴摘要:

  
      
  • Javascript对于2013年的移动应用程序使用来说太慢了(例如,用于照片编辑等)   
        
    • 它比本机代码慢了大约5
    •   
    • 可与IE8相媲美
    •   
    • 比x86 C / C ++慢约50
    •   
    • 如果你的程序适合35MB,那么它比服务器端Java / Ruby / Python / C#慢了大约10倍,并且从那里开始呈指数级下降
    •   
  •   
  • 提高速度的最可行途径是将硬件推向桌面级别的性能。这可能是长期可行的,但看起来似乎是漫长的等待。
  •   
  • 这些天语言本身似乎并没有变得更快,正在研究它的人说,使用当前的语言和API,它永远不会像本机代码那么快
  •   
  • 在内存受限的环境中,垃圾收集呈指数级恶化。它比桌面级或服务器级环境更糟糕。
  •   
  • 每个有能力的移动开发人员,无论他们是否使用GCed环境,都会花费大量时间考虑目标设备的内存性能。
  •   
  • 目前存在的JavaScript基本上反对甚至允许开发人员考虑目标设备的内存性能
  •   
  • 如果他们确实改变了主意并允许开发人员考虑内存,那么经验表明这是一个技术难题。
  •