协议
提供商
在 fuchsia.memorypressure/memorypressure.fidl 中定义
注册协议
RegisterWatcher
用于注册内存压力等级变化。
watcher
:内存压力 Watcher
通道,Provider
将使用该通道向客户端发送级别变化消息。
调用此方法时,当前内存压力水平会立即发送到观察器。
建议组件树中的根作业注册更改,而不是分别让树中后面的各个作业单独注册。较低的客户端数量有助于最大限度地减少因同时传输大量内存压力消息而导致的系统流失。此外,作业具有的上下文越多,它就越能够通过控制其树中子作业的行为来应对内存压力。
请求
名称 | 类型 |
---|---|
watcher |
Watcher
|
Watcher
在 fuchsia.memorypressure/memorypressure.fidl 中定义
Watcher 协议 由希望在内存压力级别变化时收到通知的客户端实现。
OnLevelChanged
当内存压力等级发生变化时发送到已注册的客户端。
level
:表示当前内存压力等级。
它还将在初始连接时通过 RegisterWatcher
调用,以便新注册的客户端能够发现当前内存压力等级。
观察器必须立即回复一条消息,确认它已收到级别变化通知,并因此启动了所需的操作。然后,它可能会在发送确认后继续异步回收内存。
一些面向客户的实用指南:
-
仅在提供程序收到与上一条消息对应的回复后,Watcher 才会在压力等级发生变化时收到通知。如果在此期间发生多个级别转换,Watcher 将收到最新的压力级别通知。
-
压力水平变化由边缘触发,如果需要,客户端应保持本地状态以跟踪当前的压力水平。例如,作业可能会收到 CRITIAL 级别的通知,并因此丢弃其所有缓存。一段时间后,它可能需要触发一个 activity,以分配大量内存。此时,作业应记住它看到的最后一个压力等级为“关键”,并避免触发内存密集型活动。
-
为了优化性能,提供程序可能会决定在压力水平发生变化时跳过发送消息。例如,当振动跨越 NORMAL / WARNING 边界时,可能没有必要将每个过渡都通知客户端。在这种情况下,提供程序可能会对消息进行速率限制。 同样地,提供程序可能会决定以相同的压力水平发送重复消息(尤其是“关键”),以表明需要采取进一步措施。
请求
名称 | 类型 |
---|---|
level |
Level
|
回复
<空>
枚举
等级严格
类型:uint32
在 fuchsia.memorypressure/memorypressure.fidl 中定义
表示内存压力等级。
名称 | 值 | 说明 |
---|---|---|
中 |
1 |
内存压力水平正常。 已注册的客户端可随意保留缓存并不受限制地分配内存。 但是,客户端应注意不要在转换为 NORMAL 级别时主动重新创建缓存,从而导致内存峰值立即再次将级别推入 WARNING。 |
警告 |
2 |
内存压力水平受到一定限制,如果未选中,可能会越过临界压力范围。 已注册的客户端应优化其操作以限制内存用量,而不是通过减少缓存大小和非必需的内存分配等实现最佳性能。 客户端必须注意控制为回收内存而执行的工作量,并确保这不会造成明显的性能下降。虽然存在一些内存压力,但这不足以证明需要牺牲用户响应能力来回收内存。 |
关键 |
3 |
内存压力水平非常有限。 已注册的客户端应丢弃所有非必需的内存,并避免分配更多内存。否则,可能会导致作业终止,或者在出现全局内存压力时重新启动系统。 如果需要,客户端可能会执行成本高昂的工作来回收内存,因为如果未能这样做可能会导致终止。在这种情况下,客户端可能会认为性能命中是合理的权衡。 |