【发布时间】:2019-02-06 18:41:57
【问题描述】:
TL;DR:IOSurfaceRef 在被清除且状态更改为 kIOSurfacePurgeableEmpty 后是否是可写入的有效表面?
我正在尝试更好地了解清除 IOSurface 意味着什么。我遇到的唯一文档是IOSurfaceRef.h,我遇到的唯一示例代码是WebKit。
我正在使用命令行工具memory_pressure 来模拟 10 秒的关键内存压力环境,如下所示:
> memory_pressure -S -s 10 -l critical
我编写了一个非常简单的应用程序,它分配了 100 个具有相同属性的 IOSurfaces。当我使用 Instruments 测量内存分配时,我看到 VM: IOSurface 大约为 6GB,每个表面大约为 6MB。 (4096x4096x4)
然后我将每个 IOSurface 的可清除状态更改为 kIOSurfacePurgeableVolatile 并运行 memory_pressure 模拟。
仪器仍然报告我分配了 6GB 的表面。但是,如果我检查每个表面的可清除状态,它们会被标记为kIOSurfacePurgeableEmpty。
看起来它们已成功清除,但内存仍分配给我的应用程序。为什么会这样?这些表面处于什么状态?
头文件声明我应该假设它们中有“未定义的内容”。很公平。
但是实际的IOSurfaceRef 或IOSurface * 对象仍然有效吗?我可以成功查询它的所有属性,并且可以成功锁定它以进行读写。
我是否允许仅重用该对象,即使其内容已被清除,还是我必须丢弃该实例并创建一个全新的 IOSurface?
macos 10.14
【问题讨论】:
标签: objective-c macos memory-management core-foundation iosurface