weakref - 弱引用插件
概述
weakref插件以表的方式提供弱引用机制。
弱引用表weak_table
是一种handle,其内部存储键值对,支持表的插入和查询操作。弱引用表以弱引用的方式持有键(和值),当引用类型的值只能通过弱引用访问时,称其弱可达,GC可以选择将其回收。
弱引用表关联了一个域,只有当协程在该域运行时可以访问弱表,否则将抛出异常。
注意:string类型被视作值类型,在弱引用表中存储string类型的值永远是可达的。
注意:与C++标准库中的弱指针不同,在GS中无法静态的判断一个值在特定程序点是否变成弱可达。只有当垃圾收集器确认值不可达时,弱引用表中的弱引用才被置空。
通过--require weakref引入弱引用插件,即可使用弱引用表。
weak_keys
弱引用表总是以弱引用的方式持有值(Value)。当弱引用表的weak_keys属性为true
时(默认为false
),弱引用表以弱引用的方式持有键(Key)。
一对键值无论键或值变为弱可达都将导致该键值对从弱引用表中清除。
async
当弱引用表的async属性为true
时(默认为true
),允许垃圾收集器自动清理弱可达的表项;否则,由应用程序负责在合适的位置调用clear_weakrefs
清弱可达的表现。
注意:如果不知道应该何时调用clear_weakrefs
,通常应该创建async的弱引用表。对于async为false
的弱引用表,如果不调用clear_weakrefs
将导致底层资源无法被回收并造成内存泄漏。
async属性对弱引用表的访问效率有略微影响。
性能
Ops | map | weak_table (async=true) | weak_table (async=false) |
---|---|---|---|
set | 1.794 | 2.506 | 3.271 |
get | 1.139 | 1.988 | 2.149 |