协议
提供商
在 fuchsia.memorypressure/memorypressure.fidl 中定义
注册协议
RegisterWatcher
用于注册内存压力水平变化。
watcher
:Provider
将用于发送内存压力的 Watcher
通道
将级别更改消息发送给客户端。
当前内存压力等级会立即发送给 Watcher 。
建议组件树中的根作业注册更改, 而不是单独注册树中更靠下的单个作业。 客户端数量较少有助于最大限度地减少因同时传输大量内存压力消息而导致的系统流失。此外,作业拥有的上下文越多,就越能通过控制其树中的子作业的行为来更好地应对内存压力。
请求
名称 | 类型 |
---|---|
watcher |
client_end:Watcher
|
Watcher
在 fuchsia.memorypressure/memorypressure.fidl 中定义
Watcher 协议 由希望接收内存压力水平变化通知的客户实现。
OnLevelChanged
当内存压力级别发生变化时发送给已注册的客户端。level
:表示当前的内存压力级别。
还会在通过 RegisterWatcher
进行初始连接时调用,以便新注册的客户端可以发现当前的内存压力级别。
监视器必须立即回复消息,确认已收到级别更改通知,并已据此启动所需操作。然后,它可能会在发送确认后继续异步回收内存。
面向客户的一些实用指南:
-
只有在提供程序收到与上一条消息对应的回复后,监视器才会收到有关新的压力级别变化的通知。如果在此期间发生了多个关卡转换,Watcher 将 获知最新的压力等级。
-
关卡变化在边缘触发,客户端预计会维持不变 本地状态来跟踪当前压力水平(如果需要)。例如,作业可能会收到严重级别的通知,并因此丢弃其所有缓存。此后一段时间,应用可能会想要触发导致 要分配的内存量足够高此时,作业应记住上次看到的压力级别为 CRITICAL,并避免触发占用大量内存的 activity。
-
为了优化性能,提供程序可能会决定跳过针对某些压力级别变化发送消息。例如,当在“正常”/“警告”边界之间振荡时,可能不值得向客户端通知每次转换。在这种情况下,提供商可能会对消息设置速率限制。 同样,提供程序可能会决定在同一压力级别(尤其是“严重”级别)发送重复消息,以指明需要采取进一步行动。
请求
名称 | 类型 |
---|---|
level |
Level
|
响应
<EMPTY>
枚举
严格级
类型:uint32
在 fuchsia.memorypressure/memorypressure.fidl 中定义
表示内存压力级别。
名称 | 值 | 说明 |
---|---|---|
正常 |
1 |
内存压力等级健康状况良好。 注册的客户端可以保留缓存并分配内存 不受限制。 不过,客户端应注意,在返回到 NORMAL 级别时,不要主动重新创建缓存,以免导致内存激增,从而立即将级别再次推高到 WARNING。 |
警告 |
2 |
内存压力水平在一定程度上受到了限制,可能会超过 临界压力范围。 注册的客户端应优化其操作以限制内存 而不是为了获得最佳性能,例如减少缓存大小 和非必需的内存分配 客户必须注意规范他们所承担的工作量 以便回收内存,并确保它不会导致 性能下降存在一些内存压力,但还不够 以牺牲用户响应能力来回收内存是值得的。 |
危急 |
3 |
内存压力水平非常有限。 注册的客户端应丢弃所有不必要的内存,并避免分配更多内存。否则,可能会导致作业终止,或者在出现全局内存压力时,系统重新启动。 客户端可能会在必要时执行耗费大量资源的工作来回收内存,因为如果不这样做,可能会导致终止。客户可能会决定 在这种情况下,性能命中是合理的权衡。 |