2013-10-26 42 views
2

语境:防止iOS设备上的mmap泄漏内存(是:mach_vm_map太)

  • OpenGL ES 2.0的iOS上
  • 苹果实现glBufferData的使用mach_vm_map(?不可避免的 - 这是苹果的GL驱动器内部)[更新:解决了,这是不相关的问题]
  • 苹果实现CGDataProviderCopyData的使用mmap(不可避免的 - 这是苹果系统的API?)

观察:

  1. 创建一个OpenGL表面,通过苹果的GLKViewController/GLKView
  2. 上传的几何形状和纹理
  3. ...
  4. 放弃VC和V(他们的dealloc)
  5. 苹果泄漏几十(或几百)兆字节的RAM。如果您重新启动在1,你会得到一个应用程序崩溃是由于运行内存:(
  6. 奖金:
    1. 苹果公司的仪器在“泄漏”模式重复崩溃100%的只有“分配”模式生存苹果的泄漏

静态分析器在源报告没有泄漏。[更新:解决了,静态分析仪Xcode5是差于预期]

仪器,与马克世代声称,只有苹果的两大MEM映射方法上面列出的是泄漏ING。 [更新:巧合:mach_vm_map泄漏是因为泄漏的VBO]

作为一个检查...我过度释放引用(例如CFRelease()一次太多的CGDataRef),并且它导致了预期的崩溃立即。

+1

您确定清理所有OpenGL资源吗?即删除所有纹理,几何图形等? –

+0

@ JesseRusak自动是 - 在NSObject的dealloc中。这导致我手动检查dealloc,并保留/释放,并发现wh在Xcode5应该已经抓住,但没有(见下文)。所以OpenGL/mach_vm_map方面解决了 - 但我仍然不明白的mmap。 – Adam

+0

VAO如何?你也删除它们。 OpenGL的策略是不释放内存资源,直到没有容器对象包含对它们的引用。这意味着如果你有一个带有顶点着色器和片段着色器的GLSL程序,如果你删除着色器,唯一发生的事情是着色器使用的ID可以被OpenGL重用,实际的着色器不会被释放直到程序被删除或程序的附件改变。对于所有的OpenGL容器对象,VAO,FBO,GLSL程序等都是一样的。 –

回答

0

对于mach_vm_map,事实证明:Xcode5的静态分析仪坏了:(

上的父NSObject的子类,沼泽标准内存泄漏:。丢失的释放 - 这Xcode4本来是可以赶上

对于mmap - 我仍然无法找到任何方式让Apple发布mmap :(。

+0

听起来就像你已经仔细研究过这个,所以我只能建议用http://bugreporter.apple.com记录一个错误。 –

+0

为什么你不直接问苹果工程师?在该帐户中,您有2个免费使用的dst令牌 – Andrea

+0

当您滑动时稍微向后导航,然后让其快速返回,导致视图的框架重置为意外的原点和/或大小。 – whyoz