Životní cyklus aktéra, automatické uvolňování paměti a ruční odstranění
Objekt actor se aktivuje při prvním volání některé z jeho metod. Objekt actor je deaktivován (uvolňování paměti modulem runtime Actors), pokud se nepoužívá v konfigurovatelném časovém období. Objekt actor a jeho stav lze kdykoli odstranit také ručně.
Aktivace objektu actor
Při aktivaci objektu actor dojde k následujícímu:
- Když přijde hovor pro objekt actor a jeden už není aktivní, vytvoří se nový objekt actor.
- Stav objektu actor se načte, pokud udržuje stav.
- Volá se
OnActivateAsync
metoda (C#) neboonActivateAsync
(Java), která se dá přepsat v implementaci objektu actor. - Objekt actor je nyní považován za aktivní.
Deaktivace objektu actor
Když je objekt actor deaktivován, dojde k následujícímu:
- Pokud se objekt actor po určitou dobu nepoužívá, odebere se z tabulky Active Actors.
- Volá se
OnDeactivateAsync
metoda (C#) neboonDeactivateAsync
(Java), která se dá přepsat v implementaci objektu actor. Tím se vymažou všechny časovače pro herce. Operace objektu actor, jako jsou změny stavu, by se z této metody neměly volat.
Tip
Modul runtime Fabric Actors generuje některé události související s aktivací a deaktivací objektu actor. Jsou užitečné při diagnostice a monitorování výkonu.
Uvolňování paměti objektu actor
Když je objekt actor deaktivován, uvolní se odkazy na objekt objektu actor a mohou být uvolněny z paměti běžně shromažďované modulem CLR (Common Language Runtime) nebo uvolňováním paměti virtuálního počítače Java (JVM). Uvolňování paměti pouze vyčistí objekt actor; neodebere stav uložený ve Správci stavu objektu actor. Při příštím aktivaci objektu actor se vytvoří nový objekt actor a jeho stav se obnoví.
Co se počítá jako "používané" pro účely deaktivace a uvolňování paměti?
- Přijetí hovoru
IRemindable.ReceiveReminderAsync
vyvolána metoda (platí pouze v případě, že objekt actor používá připomenutí)
Poznámka:
Pokud objekt actor používá časovače a vyvolá se zpětné volání časovače, nezapočítává se jako "používané".
Než se podíváme na podrobnosti deaktivace, je důležité definovat následující termíny:
- Interval kontroly. Jedná se o interval, ve kterém modul runtime Actors prohledává tabulku Active Actors pro aktéry, které je možné deaktivovat a uvolnění paměti. Výchozí hodnota pro tuto hodnotu je 1 minuta.
- Časový limit nečinnosti. Jedná se o dobu, po kterou musí objekt actor zůstat nevyužitý (nečinný), než ho bude možné deaktivovat a uvolnění paměti. Výchozí hodnota je 60 minut.
Obvykle tyto výchozí hodnoty nemusíte měnit. V případě potřeby je však možné tyto intervaly změnit při ActorServiceSettings
registraci služby actor:
public class Program
{
public static void Main(string[] args)
{
ActorRuntime.RegisterActorAsync<MyActor>((context, actorType) =>
new ActorService(context, actorType,
settings:
new ActorServiceSettings()
{
ActorGarbageCollectionSettings =
new ActorGarbageCollectionSettings(10, 2)
}))
.GetAwaiter()
.GetResult();
}
}
public class Program
{
public static void main(String[] args)
{
ActorRuntime.registerActorAsync(
MyActor.class,
(context, actorTypeInfo) -> new FabricActorService(context, actorTypeInfo),
timeout);
}
}
Modul runtime objektu actor pro každý aktivní objekt actor sleduje dobu nečinnosti (tj. nepoužito). Modul runtime objektu actor zkontroluje každý z herců, ScanIntervalInSeconds
aby zjistil, jestli může být uvolněn z paměti, a označí ho, pokud byl nečinný pro IdleTimeoutInSeconds
.
Kdykoli se objekt actor použije, jeho doba nečinnosti se resetuje na 0. Potom může být objekt actor uvolňování paměti pouze v případě, že znovu zůstane nečinný pro IdleTimeoutInSeconds
. Vzpomeňte si, že objekt actor je považován za použitý, pokud je spuštěna metoda rozhraní objektu actor nebo zpětné volání připomenutí objektu actor. Objekt actor se nepovažuje za použitý, pokud je spuštěno zpětné volání časovače.
Následující diagram znázorňuje životní cyklus jednoho aktéra, který znázorňuje tyto koncepty.
Příklad ukazuje dopad volání metody objektu actor, připomenutí a časovačů na dobu života tohoto objektu actor. V příkladu stojí za zmínku následující body:
- ScanInterval a IdleTimeout jsou nastaveny na 5 a 10 v uvedeném pořadí. (Jednotky tady nezáleží, protože naším účelem je pouze ilustrovat koncept.)
- Při kontrole, že aktéři budou uvolněni z paměti, probíhá v hodnotě T=0,5,10,15,20,25, jak je definováno intervalem kontroly 5.
- Pravidelný časovač se aktivuje na T=4,8,12,16,20,24 a spustí se zpětná volání. Nemá vliv na dobu nečinnosti objektu actor.
- Volání metody objektu actor v T=7 resetuje dobu nečinnosti na 0 a zpožďuje uvolňování paměti objektu actor.
- Zpětné volání připomenutí objektu actor se spustí v T=14 a dále zpožďuje uvolňování paměti objektu actor.
- Během kontroly uvolňování paměti v T=25, doba nečinnosti herce nakonec překročí časový limit nečinnosti 10 a herec je uvolněn.
Objekt actor nebude nikdy uvolňování paměti, když provádí jednu z jeho metod, bez ohledu na to, kolik času je stráveno při provádění této metody. Jak už bylo zmíněno dříve, provádění metod rozhraní objektu actor a zpětné volání připomenutí brání uvolňování paměti resetováním doby nečinnosti objektu actor na 0. Provádění zpětných volání časovače neobnovuje dobu nečinnosti na 0. Uvolnění paměti objektu actor je však odloženo, dokud se nedokončí zpětné volání časovače.
Ruční odstranění objektů actor a jejich stavu
Uvolnění paměti deaktivovaných objektů actor pouze vyčistí objekt objektu actor, ale neodebere data uložená ve správci stavu objektu actor. Při opětovné aktivaci objektu actor se jeho data znovu zpřístupní prostřednictvím správce stavu. V případech, kdy aktéři ukládají data ve Správci stavů a deaktivují se, ale nikdy se znovu neaktivují, může být nutné data vyčistit. Příklady, jak odstranit aktéry, číst aktéry odstranění a jejich stav.