您可以重复使用已清除的IOSurface吗



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

所以看起来它们被成功清除了,但内存仍然分配给了我的应用程序。为什么会这样,这些表面处于什么状态?

头文件指出,我应该假设它们中有"未定义的内容"。很公平。

但是实际的IOSurfaceRefIOSurface *对象仍然有效吗?我可以成功地查询它的所有属性,并且可以成功地锁定它进行读写。

是否允许我只重用该对象,即使其内容已被清除,还是必须放弃该实例并创建一个全新的IOSurface?

macos 10.14

是的,它仍然可用。只是像素数据丢失了。

基本上,当系统处于内存压力下时,它通常会将数据分页到磁盘。将可清除对象标记为volatile允许系统简单地丢弃该数据。该应用程序表示,虽然拥有它很好,但它不是必须拥有的,如果需要,可以重新创建。

当它想再次使用IOSurface时,应用程序应该将对象标记为非易失性,并检查旧状态。如果它是空的,那么应用程序应该重新创建数据。

Instruments报告您的应用程序仍有6GB的分配空间,是因为它为IOSurfaces保留了6GB的地址空间。但分配并不一定意味着由物理RAM或交换文件支持。它只是记账,直到内存被实际使用。应用程序的常驻集大小(RSS)应该缩小。

相关内容

  • 没有找到相关文章

最新更新