Latest web development tutorials

garbage collection Lua

Lua utilizza la gestione automatica della memoria. Questo significa che non c'è bisogno di preoccuparsi per l'oggetto appena creato su come allocare la memoria, essi non considerano il modo in cui rilasciano la memoria occupata dopo che l'oggetto non è più in uso.

Lua è in esecuzione ungarbage collector di raccogliere tutti gli oggetti morti(cioè, gli oggetti non possono essere accessibili in Lua) per eseguire la gestione automatica della memoria. Lua è usato in tutta la memoria, come ad esempio: string, tabelle, dati utente, funzioni, filetti, struttura interna, ecc, possono essere soggette a gestione automatica.

Lua implementa un marchio incrementale - collettore di scansione. Esso utilizza due numeri per controllare il ciclo di raccolta dei rifiuti: tasso di raccolta garbage collector rifiuti e ingrandimento passo intermittente. Entrambe le figure utilizzano la percentuale di unità (ad esempio: un valore di 100 nella rappresentazione interna 1).

garbage collection controlla in modo intermittente il tasso deve raccogliere prima di aprire un nuovo ciclo di aspettare a lungo. Aumentando questo valore si riduce l'entusiasmo del collettore. Quando questo valore è inferiore a 100, quando il collettore prima di aprire il nuovo ciclo non dovrà attendere. Impostare questo valore per 200 consentirà collezionisti attendere fino al doppio dell'utilizzo totale memoria raggiunge prima l'inizio di un nuovo ciclo.

Il stepper ingrandimento garbage collector controlla la velocità di funzionamento del collettore rispetto al rapporto di velocità allocazione di memoria. Questo non solo aumentare il valore del collettore più aggressivo, ma anche aumentare la lunghezza di ogni scatto. Non impostare questo valore deve essere inferiore a 100, quindi se il collettore di lavorare lento in modo sempre tanto da fare un ciclo. Il valore di default è 200, che significa che l'allocazione di memoria al collettore del lavoro di velocità "doppio".

Se fate un passo ingrandimento per un numero molto elevato (il numero di byte di quello che può essere utilizzato in programma è più grande anche del 10%), il collettore si comporta come un collettore di arresto-il-mondo. Poi, se si mette il tasso intermittente impostato su 200, il comportamento del collettore e passato versioni Lua dello stesso: ogni memoria utilizzata da Lua raddoppiato, per fare una collezione completa.


funzione di garbage collector

Lua fornisce le seguenti funzioniCollectGarbage ([opt [, arg] ]) è utilizzato per controllare la gestione automatica della memoria:

  • CollectGarbage ( "raccogliere"): fare un ciclo completo garbage collection.Il parametro opt che fornisce un diverso insieme di funzioni:

  • CollectGarbage ( "count"): K per restituire il numero di byte quantità totale di memoria utilizzata da Lua.Questo valore ha una parte frazionaria, abbiamo solo bisogno di moltiplicarsi 1024 è possibile ottenere il numero esatto di byte usati per Lua (a meno che non overrun).

  • CollectGarbage ( "restart"): Riavviare il garbage collector viene eseguito automaticamente.

  • CollectGarbage ( "setpause"): Impostare la velocità intermittente arg collettore (vedi sez; 2,5).Ritorno al valore precedente del tasso intermittente.

  • CollectGarbage ( "setstepmul"): restituisce il valore precedente l'ingrandimento passo.

  • CollectGarbage ( "step"): one-step eseguito il garbage collector.Step "formato" da un controllo ARG. 0 in entrata collettore passo-passo (indivisibile) passo. Incoming valore diverso da zero, collettore per raccogliere l'assegnazione equivalente Lua di queste molteplici (K byte) di memoria di lavoro. Se l'estremità collettore di un ciclo ritornerà true.

  • CollectGarbage ( "stop"): Stop viene eseguito il garbage collector.Prima di chiamare il riavvio, il collettore solo a causa di una chiamata esplicita a correre.

Quanto segue dimostra una semplice raccolta dei rifiuti Esempio:

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

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

Il programma di cui sopra, i risultati di output sono i seguenti (cambiamento nota l'utilizzo di memoria):

20.9560546875
20.9853515625
0
19.4111328125