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