首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您能重用已被清除的IOSurface吗?

您能重用已被清除的IOSurface吗?
EN

Stack Overflow用户
提问于 2019-02-06 18:41:57
回答 1查看 674关注 0票数 2

TL;DR:在IOSurfaceRef被清除并状态更改为kIOSurfacePurgeableEmpty之后,它是一个可写入的有效曲面吗?

我试图更好地理解清除IOSurface意味着什么。我看到的唯一文档是IOSurfaceRef.h,我看到的唯一示例代码是WebKit。

我使用命令行工具memory_pressure模拟了10秒的关键内存压力环境,如下所示:

代码语言:javascript
复制
> memory_pressure -S -s 10 -l critical

我编写了一个非常简单的应用程序,用相同的属性分配100个IOSurfaces。当我使用仪器测量内存分配时,我看到VM: IOSurface大约是6GB,每个表面大约是6MB。(4096x4096x4)

然后,我将每个IOSurface的可清除状态更改为kIOSurfacePurgeableVolatile,并运行memory_pressure模拟。

仪器仍然报告说,我有6GB的表面分配。但是,如果我检查每个表面的可清除状态,它们将被标记为kIOSurfacePurgeableEmpty

所以看起来它们被成功地清除了,但是内存仍然分配给我的应用程序。为什么这些表面在什么条件下?

头文件声明,我应该假设它们中有“未定义的内容”。当然可以。

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

即使清除了对象的内容,我是否仍然可以重用该对象,还是必须放弃该实例并创建一个全新的IOSurface?

macos 10.14

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-06 19:50:00

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

基本上,当系统处于内存压力之下时,它通常会将数据分页到磁盘。标记可清除对象易失性允许系统简单地丢弃该数据。该应用程序已经表明,虽然它是美好的,但它没有-拥有,并可以在必要时重新创建。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54560477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档