Latest web development tutorials

recolección de basura Lua

Lua usa la gestión de memoria automática. Esto significa que usted no tiene que preocuparse por el objeto recién creado la manera de asignar memoria, no tienen en cuenta la forma en que libera la memoria ocupada después de que el objeto ya no está siendo utilizado.

Lua está ejecutando unrecolector de basurapara recoger todos losobjetos muertos(es decir, los objetos no se puede acceder en Lua) para llevar a cabo la gestión de memoria automática. Lua se utiliza en toda la memoria, tales como: cuerdas, tablas, datos de usuario, funciones, hilos, estructura interna, etc., están sujetos a la gestión automática.

Lua implementa una marca incrementales - colector de escaneo. Utiliza dos números para controlar el ciclo de recogida de basura: basura de tasa de recaudación recolector de basura y de aumento paso a paso intermitente. Ambas figuras utilizan el porcentaje de unidades (por ejemplo: un valor de 100 en la representación interna 1).

La recolección de basura controla de forma intermitente la tasa tiene que recoger antes de abrir un nuevo ciclo que esperar mucho tiempo. El aumento de este valor reducirá el entusiasmo del colector. Cuando este valor es inferior a 100, cuando el colector antes de abrir el nuevo ciclo no tendrá que esperar. Establecer este valor a 200 permitirá a los coleccionistas que esperar hasta el doble del uso total de memoria alcanza antes del inicio de un nuevo ciclo.

El aumento paso a paso recolector de basura controla la velocidad de funcionamiento del colector relativa relación de velocidad de asignación de memoria a. Esto no sólo aumentará el valor del colector más agresivo, sino también aumentar la longitud de cada paso incrementales. No establezca este valor sea inferior a 100, por lo que si el colector funcione lento por lo que siempre hay mucho que hacer un bucle. El valor por defecto es 200, lo que significa que la asignación de memoria al colector del trabajo de velocidad "doble".

Si das un paso de ampliación a un número muy grande (el número de bytes que puede ser utilizada en el programa es también un 10% más grande), el colector actúa como un colector de stop-el-mundo. Entonces, si se pone el intermitente tasa se establece en 200, el comportamiento del colector y más allá de las versiones de Lua de la misma: cada memoria utilizada por Lua se duplicó, para hacer una colección completa.


función de recolector de basura

Lua ofrece las siguientes funcionescollectgarbage ([opt [, arg] ]) se usa para controlar la gestión de memoria automática:

  • collectgarbage ( "collect"): hacer un ciclo completo de recolección de basura.El opt parámetro que ofrece un conjunto diferente de funciones:

  • collectgarbage ( "count"): K devolver el número de bytes cantidad total de memoria utilizada por Lua.Este valor tiene una parte fraccional, sólo tenemos que multiplicar 1024 se puede obtener el número exacto de bytes utilizado por Lua (a menos rebasamiento).

  • collectgarbage ( "reinicio"): reiniciar el recolector de basura se ejecuta automáticamente.

  • collectgarbage ( "setpause"): Configure la velocidad intermitente colector arg (véase la sección; 2,5).Volver al valor previo de la tasa intermitente.

  • collectgarbage ( "setstepmul"): Devuelve el valor anterior de la ampliación del paso.

  • collectgarbage ( "paso"): un solo paso ejecutar el recolector de basura.Paso el "tamaño" de un control arg. 0 entrante colector paso a paso (indivisible) paso. Entrante valor distinto de cero, colector para recoger la asignación Lua equivalente de estos múltiples (K bytes) de la memoria de trabajo. Si al final de un ciclo colector devolverá true.

  • collectgarbage ( "stop"): para las ejecuta el recolector de basura.Antes de llamar a la reanudación, el colector sólo por una llamada explícita a ejecutar.

A continuación se muestra un ejemplo sencillo de recolección de basura:

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

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

El programa anterior, los resultados de salida son los siguientes (nota el cambio en el uso de memoria):

20.9560546875
20.9853515625
0
19.4111328125