Orleans 2.0 官方文档 —— 5.5.7 集群和客户端 -> 配置指南 -> 激活体垃圾收集

激活体的垃圾收集

如“核心概念”一章所述,grain的激活体是grain类在内存中的实例,它由Orleans运行时根据需要自动创建,作为grain的临时物理体。

激活体垃圾收集(激活体GC)是从内存中移除未使用的grain激活体的过程。它在概念上类似于.NET中的内存垃圾收集。但是,激活体的GC仅考虑特定grain激活空闲的时间,不考虑内存使用率的这一因素。

激活体GC的工作原理

激活体GC的一般过程涉及到一个silo中的Orleans运行时,它定期扫描在配置的时间段内(Collection Age Limit),根本没有使用的grain激活体。一旦颗粒激活空闲了那么长时间,它就会被停用。停用过程从运行时调用grain的 OnDeactivateAsync()方法开始,并通过从silo的所有数据结构中删除对grain激活对象的引用来完成,以便.NET GC回收内存。

因此,在不增加应用程序代码负担的情况下,只有最近使用的grain激活体保留在内存中,而不再使用的激活体被自动删除,并且它们使用的系统资源被运行时回收。

对于grain激活体收集而言,什么算是“活跃”

  • 收到一个方法调用
  • 收到一个提醒(reminder)
  • 通过流收到一个事件

对于grain激活体收集而言,什么不算作“活跃”

  • 执行一个调用(对另一个grain或orleans客户端)
  • 计时器事件
  • 任意IO操作或不涉及Orleans框架的外部调用

收集年龄限(Collection Age Limit

一个grain激活体从空闲到被激活体GC回收的这段时间称为收集年限。默认的收集年限为2小时,但可以全局更改,也可以针对单个grain类更改。

显式地控制激活体GC

延迟激活体GC

graini激活体可以通过调用this.DelayDeactivation()方法,来延迟它被激活体GC回收:

protected void DelayDeactivation(TimeSpan timeSpan)

此调用将确保至少在指定的时间段内,此激活体不被停用。它优先于配置中指定的激活垃圾收集设置,但不会取消这些设置。因此,此调用提供了一个额外的钩子,将停用时间延迟到激活体GC设置中指定的范围之外。此调用不能用于加速激活垃圾收集。

timeSpan为正值,表示“在该时间跨度内阻止此激活体的GC”。

timeSpan为负值,表示“取消先前的调用DelayDeactivation的设置,并使此激活体基于常规的激活体GC设置”。

场景:

1)激活体垃圾收集设置指定了10分钟的年龄限,并且grain调用了DelayDeactivation(TimeSpan.FromMinutes(20)),它将导致此激活至少20分钟不被收集。

2)激活体垃圾收集设置指定了10分钟的年龄限,并且grain调用了DelayDeactivation(TimeSpan.FromMinutes(5)),如果没有额外的调用,则在10分钟后激活体被回收。

3)激活体垃圾收集设置指定了10分钟的年龄限,并且grain调用了DelayDeactivation(TimeSpan.FromMinutes(5)),并且在7分钟之后对该grain进行另一次调用,如果没有额外的调用,则从时间点零的17分钟后激活被回收。

4)激活体垃圾收集设置指定了10分钟的年龄限,并且grain调用了DelayDeactivation(TimeSpan.FromMinutes(20)),并且在7分钟之后对该谷物进行另一次调用,如果没有额外的调用,则从时间点零的20分钟后激活被回收。

请注意,DelayDeactivation并非100%保证在指定的时间段到期之前,grain激活体不会被停用。某些故障情况可能导致grain“过早”地停用。这意味着DelayDeactivation 不能被用作将grain激活体永久性地“固定”到内存中或特定silo的手段DelayDeactivation仅仅是一种优化机制,它可以帮助降低随着时间的推移,停用和重新激活grain的总成本(如果这很重要的话)。在大多数情况下,根本不需要使用DelayDeactivation

加快激活体GC

grain激活体还可以通过调用this.DeactivateOnIdle()方法,来指示运行时在下次空闲时将其停用:

protected void DeactivateOnIdle()

如果此时不处理任何消息,则认为grain激活体是空闲的。如果您在grain正在处理消息时调用DeactivateOnIdle,则一旦当前消息处理完成,它将被立即停用。

如果有任何排队等待grain的请求,它们将被转发到下一次激活体。

DeactivateOnIdle优先于配置中指定的激活垃圾收集设置,也优先于DelayDeactivation。请注意,此设置仅适用于调用它的grain激活体,并不适用于此类型的其他grain激活体。

配置

可以使用以下GrainCollectionOptions选项,来配置grain垃圾收集:

mySiloHostBuilder.Configure<GrainCollectionOptions>(options =>
{
  // Set the value of CollectionAge to 10 minutes for all grain
  options.CollectionAge = TimeSpan.FromMinutes(10);
  // Override the value of CollectionAge to 5 minutes for MyGrainImplementation
  options.ClassSpecificCollectionAge[typeof(MyGrainImplementation).FullName] = TimeSpan.FromMinutes(5);
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值