TL; DR:是的IOSurfaceRef
有效的表面已被清除后写入并且其状态改为kIOSurfacePurgeableEmpty
?
我试图得到一个更好的理解这是什么意思为要清除的IOSurface
。我所遇到的唯一文档是在IOSurfaceRef.h
和唯一的代码示例我遇到的WebKit中。
我使用的命令行工具memory_pressure
以模拟10秒,像这样的一个关键内存压力环境:
> memory_pressure -S -s 10 -l critical
我写了一个非常简单的应用,分配100 IOSurfaces
具有相同的属性。当我使用仪器来测量存储器分配,我看到VM: IOSurface
在大致6GB,约为6MB每个表面。 (4096x4096x4)
然后,我改变每个IOSurface
的吹出的状态kIOSurfacePurgeableVolatile
和运行memory_pressure模拟。
仪器还报告说我有分配的表面的6GB。不过,如果我检查每个面的吹出的状态,它们标记为kIOSurfacePurgeableEmpty
。
因此,它看起来像他们成功清除,但内存仍然分配给我的应用程序。这是为什么,什么条件是这些表面的?
我应该相信他们的头文件指出在他们“未定义的内容”。很公平。
但实际IOSurfaceRef
或IOSurface *
对象是否仍然有效?我能够成功查询的所有属性都和我可以成功地锁定了阅读和写作。
我可以在刚刚重用的对象,即使它的内容被清除或做我不得不放弃这个实例,并创建一个全新的IOSurface?
MacOS的10:14
是的,它仍然是可用的。这只是像素数据已经丢失。
基本上,当系统是在内存压力下,它通常会页面数据到磁盘。标记一个可净化对象挥发性允许系统简单地丢弃该数据,来代替。该应用程序已表示,虽然这是很好的到了,这不是有到有,并在必要时可以重新创建。
当它想再次与IOSurface
工作,应用程序应该将对象标记非易失性并检查老态。如果是空的,那么应用程序应该重新创建数据。
该仪器报告说,您的应用程序仍然6GB分配的原因是因为它对于IOSurface
s保留其地址空间的6GB。但分配并不一定意味着通过物理RAM或交换文件的支持。这只是记账,直到内存被实际使用。你的应用程序的驻留集大小(RSS)应该收缩。