Lua - Coleta de Lixo

Lua usa gerenciamento automático de memória que usa coleta de lixo com base em certos algoritmos embutidos em Lua. Como resultado do gerenciamento automático de memória, como desenvolvedor -

  • Não há necessidade de se preocupar em alocar memória para objetos.
  • Não há necessidade de liberá-los quando não forem mais necessários, exceto para defini-lo como nulo.

Lua usa um coletor de lixo que é executado de tempos em tempos para coletar objetos mortos quando eles não estão mais acessíveis a partir do programa Lua.

Todos os objetos, incluindo tabelas, dados do usuário, funções, thread, string e assim por diante, estão sujeitos ao gerenciamento automático de memória. Lua usa marca incremental e coletor de varredura que usa dois números para controlar seus ciclos de coleta de lixo, a sabergarbage collector pause e garbage collector step multiplier. Esses valores estão em porcentagem e o valor 100 costuma ser igual a 1 internamente.

Pausa do coletor de lixo

A pausa do coletor de lixo é usada para controlar quanto tempo o coletor de lixo precisa esperar, antes; ele é chamado novamente pelo gerenciamento automático de memória da Lua. Valores menores que 100 significam que Lua não esperará pelo próximo ciclo. Da mesma forma, valores mais altos desse valor resultariam no coletor de lixo sendo lento e menos agressivo por natureza. Um valor de 200 significa que o coletor espera que a memória total em uso dobre antes de iniciar um novo ciclo. Portanto, dependendo da natureza e da velocidade do aplicativo, pode haver um requisito para alterar esse valor para obter o melhor desempenho em aplicativos Lua.

Multiplicador de etapas do coletor de lixo

Este multiplicador de passo controla a velocidade relativa do coletor de lixo em relação à alocação de memória no programa Lua. Valores de etapa maiores farão com que o coletor de lixo seja mais agressivo e também aumentará o tamanho da etapa de cada etapa incremental da coleta de lixo. Valores menores que 100 podem freqüentemente levar a evitar que o coletor de lixo não complete seu ciclo e geralmente não é preferido. O valor padrão é 200, o que significa que o coletor de lixo é executado duas vezes mais que a velocidade de alocação de memória.

Funções do coletor de lixo

Como desenvolvedores, temos algum controle sobre o gerenciamento automático de memória em Lua. Para isso, temos os seguintes métodos.

  • collectgarbage("collect") - Executa um ciclo completo de coleta de lixo.

  • collectgarbage("count") - Retorna a quantidade de memória atualmente usada pelo programa em Kilobytes.

  • collectgarbage("restart") - Se o coletor de lixo foi parado, ele o reinicia.

  • collectgarbage("setpause")- Define o valor fornecido como segundo parâmetro dividido por 100 para a variável de pausa do coletor de lixo. Seus usos são discutidos um pouco acima.

  • collectgarbage("setstepmul")- Define o valor dado como segundo parâmetro dividido por 100 para a variável multiplicadora de passo de lixo. Seus usos são discutidos um pouco acima.

  • collectgarbage("step")- Executa uma etapa da coleta de lixo. Quanto maior for o segundo argumento, maior será esta etapa. O collectgarbage retornará true se a etapa acionada foi a última etapa de um ciclo de coleta de lixo.

  • collectgarbage("stop") - Pára o coletor de lixo se estiver em execução.

Um exemplo simples usando o exemplo do coletor de lixo é mostrado abaixo.

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

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

Quando executamos o programa acima, obteremos a seguinte saída. Observe que este resultado irá variar devido à diferença no tipo de sistema operacional e também ao recurso de gerenciamento automático de memória de Lua.

23.1455078125   149
23.2880859375   295
0
22.37109375     380

Você pode ver no programa acima, uma vez que a coleta de lixo é feita, ela reduz a memória usada. Mas, não é obrigatório chamar isso. Mesmo que não os chamemos, ele será executado automaticamente em um estágio posterior pelo intérprete de Lua após o período predefinido.

Obviamente, podemos alterar o comportamento do coletor de lixo usando essas funções, se necessário. Essas funções fornecem um pouco de capacidade adicional para o desenvolvedor lidar com situações complexas. Dependendo do tipo de memória necessária para o programa, você pode ou não usar este recurso. Mas é muito útil saber o uso de memória nas aplicações e verificá-lo durante a própria programação para evitar resultados indesejados após a implantação.