Lua - Garbage Collection

Lua utilizza la gestione automatica della memoria che utilizza la garbage collection basata su alcuni algoritmi incorporati in Lua. Come risultato della gestione automatica della memoria, come sviluppatore -

  • Non c'è bisogno di preoccuparsi dell'allocazione della memoria per gli oggetti.
  • Non c'è bisogno di liberarli quando non sono più necessari tranne che per impostarlo a zero.

Lua utilizza un garbage collector che viene eseguito di volta in volta per raccogliere oggetti morti quando non sono più accessibili dal programma Lua.

Tutti gli oggetti inclusi tabelle, dati utente, funzioni, thread, stringhe e così via sono soggetti alla gestione automatica della memoria. Lua utilizza un contrassegno incrementale e uno sweep collector che utilizza due numeri per controllare i suoi cicli di raccolta dei rifiutigarbage collector pause e garbage collector step multiplier. Questi valori sono in percentuale e il valore di 100 è spesso uguale a 1 internamente.

Pausa del Garbage Collector

La pausa del Garbage Collector viene utilizzata per controllare quanto tempo deve attendere il Garbage Collector, prima; viene richiamato di nuovo dalla gestione automatica della memoria di Lua. Valori inferiori a 100 significherebbero che Lua non aspetterà il ciclo successivo. Allo stesso modo, valori più alti di questo valore risulterebbero in un Garbage Collector lento e di natura meno aggressiva. Un valore di 200 significa che il collector attende il raddoppio della memoria totale in uso prima di iniziare un nuovo ciclo. Quindi, a seconda della natura e della velocità dell'applicazione, potrebbe essere necessario modificare questo valore per ottenere le migliori prestazioni nelle applicazioni Lua.

Moltiplicatore passo Garbage Collector

Questo moltiplicatore di passaggi controlla la velocità relativa del garbage collector rispetto a quella dell'allocazione della memoria nel programma Lua. Valori di passaggio più grandi porteranno al Garbage Collector più aggressivo e aumenteranno anche le dimensioni del passaggio di ogni passaggio incrementale di Garbage Collection. Valori inferiori a 100 potrebbero spesso portare ad evitare che il garbage collector non completi il ​​suo ciclo e non è generalmente preferito. Il valore predefinito è 200, il che significa che il Garbage Collector viene eseguito il doppio della velocità di allocazione della memoria.

Funzioni di Garbage Collector

Come sviluppatori, abbiamo un certo controllo sulla gestione automatica della memoria in Lua. Per questo, abbiamo i seguenti metodi.

  • collectgarbage("collect") - Esegue un ciclo completo di garbage collection.

  • collectgarbage("count") - Restituisce la quantità di memoria attualmente utilizzata dal programma in kilobyte.

  • collectgarbage("restart") - Se il Garbage Collector è stato arrestato, lo riavvia.

  • collectgarbage("setpause")- Imposta il valore dato come secondo parametro diviso per 100 nella variabile di pausa del Garbage Collector. I suoi usi sono come discusso poco sopra.

  • collectgarbage("setstepmul")- Imposta il valore dato come secondo parametro diviso per 100 nella variabile del moltiplicatore del passo di spazzatura. I suoi usi sono come discusso poco sopra.

  • collectgarbage("step")- Esegue un passaggio della raccolta dei rifiuti. Più grande è il secondo argomento, più grande sarà questo passaggio. Il collectgarbage restituirà true se il passaggio attivato è stato l'ultimo passaggio di un ciclo di raccolta dei rifiuti.

  • collectgarbage("stop") - Arresta il Garbage Collector se è in esecuzione.

Di seguito è mostrato un semplice esempio che utilizza l'esempio del garbage collector.

mytable = {"apple", "orange", "banana"}

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

Quando eseguiamo il programma precedente, otterremo il seguente output. Si noti che questo risultato varierà a causa della differenza nel tipo di sistema operativo e anche della funzione di gestione automatica della memoria di Lua.

23.1455078125   149
23.2880859375   295
0
22.37109375     380

Puoi vedere nel programma sopra, una volta completata la raccolta dei rifiuti, ha ridotto la memoria utilizzata. Ma non è obbligatorio chiamarlo. Anche se non li chiamiamo, verrà eseguito automaticamente in una fase successiva dall'interprete Lua dopo il periodo predefinito.

Ovviamente, possiamo modificare il comportamento del garbage collector utilizzando queste funzioni se necessario. Queste funzioni forniscono allo sviluppatore un po 'di capacità aggiuntive per gestire situazioni complesse. A seconda del tipo di memoria necessaria per il programma, è possibile o meno utilizzare questa funzione. Ma è molto utile conoscere l'utilizzo della memoria nelle applicazioni e controllarlo durante la programmazione stessa per evitare risultati indesiderati dopo la distribuzione.