English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Coleta de Lixo do Lua

O Lua adota o gerenciamento de memória automático. Isso significa que você não precisa se preocupar com como a memória é alocada para novos objetos, nem com como liberar a memória ocupada pelos objetos quando não mais usados.

O Lua executou umcoletor de lixopara coletar todosobjetos mortos ((que é impossível acessar mais no Lua)) para realizar o trabalho de gerenciamento de memória automático. Toda a memória usada no Lua, como: strings, tabelas, dados de usuário, funções, threads, estruturas internas, etc., são sujeitas a gerenciamento automático.

O Lua implementou um sinal de marcação incremental-coletor de varredura. Ele usa esses dois números para controlar o ciclo de coleta de lixo: a taxa de interrupção do coletor de lixo e a taxa de passo do coletor de lixo. Ambos os números usam porcentagem como unidade (por exemplo: valor 100 internamente representa 1 )

A taxa de interrupção do coletor de lixo controla o tempo que o coletor precisa esperar antes de abrir um novo ciclo. O aumento deste valor reduzirá a atividade do coletor. Quando este valor for 100 quando pequeno, o coletor não aguardará antes de abrir um novo ciclo. Defina este valor para 200, isso fará com que o coletor aguarde até que o uso total da memória atinja o dobro do valor anterior antes de começar um novo ciclo.

A taxa de passo do coletor de lixo controla a taxa de operação do coletor de lixo em relação à taxa de alocação de memória. Aumento deste valor não só tornará o coletor mais ativo, mas também aumentará o comprimento de cada passo incremental. Não defina este valor menor do que 100, então o coletor de lixo trabalhará tão lentamente que nunca terminará um ciclo. O valor padrão é 200, isso significa que o coletor de lixo trabalha a "dobro" da velocidade de alocação de memória.

se você definir a taxa de passo para um número muito grande (maior do que o número de bytes que seu programa pode usar) 10%%), o comportamento do coletor de lixo é semelhante a um stop-the-coletor world. Em seguida, se você definir a taxa de interrupção para 200, o comportamento do coletor de lixo é o mesmo que nas versões anteriores do Lua: a cada vez que a memória usada pelo Lua dobrar, é feito um coletamento completo.

funções do coletor de lixo

O Lua oferece as seguintes funçõescollectgarbage ([opt [, arg]])Usado para controlar a gestão automática de memória:

  • collectgarbage("collect"):  Fazer uma coleta de lixo completa. O parâmetro opt oferece um conjunto de diferentes funcionalidades:

  • collectgarbage("count"): Retornar o número total de bytes usados pelo Lua em unidade de K bytes. Este valor tem uma parte fracionária, então é necessário multiplicar 1024 Pode-se obter o número exato de bytes usados pelo Lua (a menos que haja overflow).

  • collectgarbage("restart"): Reiniciar a execução automática do coletor de lixo.

  • collectgarbage("setpause"): Definir arg como a taxa de intervalo do coletor. Retornar o valor anterior da taxa de intervalo.

  • collectgarbage("setstepmul"): Retornar o valor anterior da taxa de passo.

  • collectgarbage("step"): Executar o coletor de lixo passo a passo. O comprimento do passo é controlado pelo arg. Quando 0 é传入,o coletor avança um passo (indivisível). Quando um valor não zero é传入,o coletor coleta o equivalente a Lua alocar esses múltiplos (K bytes) de memória. Se o coletor terminar um ciclo, ele retornará true .

  • collectgarbage("stop"): Parar a execução do coletor de lixo. Antes de chamar o reinício, o coletor só será executado devido a chamadas explícitas.

A seguir, é demonstrado um exemplo simples de coleta de lixo:

mytable = {"apple", "orange", "banana"}
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))

Execute o programa acima e os resultados serão como follows (observe a variação no uso da memória):

20.9560546875
20.9853515625
0
19.4111328125