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

Lua 가비지 수집

Lua는 자동 메모리 관리를 사용합니다. 이는 새로운 객체가 필요한 메모리를 어떻게 할당할지 괄시지 않아도 되고, 객체가 더 이상 사용되지 않을 때 메모리를 어떻게 해제할지 고려하지 않아도 된다는 것을 의미합니다.

Lua가garbage collector모든사망 객체 (Lua에서 더 이상 접근할 수 없는 객체가 됩니다)로 자동 메모리 관리를 수행합니다. Lua에서 사용되는 모든 메모리(문자열, 테이블, 사용자 데이터, 함수, 스레드, 내부 구조 등)는 자동으로 관리됩니다.

Lua가 증분 표시 기능을 구현했습니다-스캔 컬렉터. 이는 두 가지 숫자를 사용하여 가bage collection 반복을 제어합니다: garbage collector 중간 주기와 garbage collector 진행 비율. 이 두 가지 숫자는 모두 백분율로 표시됩니다 (예: 값 100은 내부적으로 1 )

garbage collector 중간 주기는 컬렉터가 새로운 반복을 시작하기 전에 얼마나 오랫동안 기다려야 하는지를 제어합니다. 이 값을 늘리면 컬렉터의 적극성을 줄입니다. 이 값이 100을 설정하면, 이는 컬렉터가 새로운 반복을 시작하기 전에 기다리지 않도록 합니다. 이 값을 설정하면 200을 설정하면, 이는 컬렉터가 총 메모리 사용량이 이전 두 배에 도달할 때까지 새로운 반복을 시작하지 않도록 합니다.

garbage collector 진행 비율은 컬렉터가 메모리 할당 속도에 비해 작동 속도를 조절하는 비율을 제어합니다. 이 값을 늘리면 컬렉터가 더 적극적이고, 각 증분 단계의 길이도 늘립니다. 이 값을 0보다 작게 설정하지 마세요. 100을 설정하면, 그렇게 하면 컬렉터는 반복을 끝까지 완료할 수 없이 너무 느리게 작동합니다. 기본 값은 200을 설정하면, 이는 컬렉터가 메모리 할당의 "두 배" 속도로 작동한다는 것을 의미합니다.

만약 당신이 진행 비율을 매우 큰 숫자로 설정하면 (당신의 프로그램이 사용할 수 있는 바이트 수보다 큰 10%), 컬렉터의 행동은 stop과 같습니다.-the-world 컬렉터. 그런 다음, 중간 주기를 설정하면 200, 컬렉터의 행동은 과거 Lua 버전과 같습니다: Lua가 사용하는 메모리가 두 배될 때마다 완전한 수집을 수행합니다.

garbage collector 함수

Lua를 제공하는 다음 함수collectgarbage ([opt [, arg]])자동 메모리 관리를 제어합니다:

  • collectgarbage("collect"):  하나의 완전한 가비지 수집 루프를 수행합니다. opt 매개변수는 다양한 기능을 제공합니다:

  • collectgarbage("count"): Lua가 사용하는 총 메모리 수를 K 바이트 단위로 반환합니다. 이 값에는 소수점 부분이 있으므로 이 값을 곱해야 합니다 1024 Lua가 사용하는 정확한 바이트 수를 얻을 수 있습니다(예외는 제외).

  • collectgarbage("restart"): 가비지 수집기를 자동으로 다시 시작합니다.

  • collectgarbage("setpause"): arg를 수집기의 간격 비율로 설정합니다. 간격 비율의 이전 값을 반환합니다.

  • collectgarbage("setstepmul"): 단계 진행 비율의 이전 값을 반환합니다.

  • collectgarbage("step"): 가비지 수집기를 단계적으로 실행합니다. 단계 "크기"는 arg에서 제어됩니다. 0을 전달하면 수집기는 단계적으로 진행합니다. 0이 아닌 값을 전달하면 수집기는 Lua가 배정한 이 많은(K 바이트) 메모리를 수집합니다. 수집기가 반복을 종료하면 true를 반환합니다.

  • collectgarbage("stop"): 가비지 수집기를 중지합니다. 다시 시작 전까지 수집기는 명시적으로 호출됨에 따라만 수집합니다.

아래는 간단한 가비지 수집 예제를 보여줍니다:

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

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다(메모리 사용 변화에 주의하세요):

20.9560546875
20.9853515625
0
19.4111328125