루아 가비지 수집
Lua는 자동 메모리 관리를 사용합니다. 즉, 새로 생성된 개체에 필요한 메모리를 할당하는 방법에 대해 걱정할 필요가 없으며 개체가 더 이상 사용되지 않은 후 개체가 차지한 메모리를 해제하는 방법에 대해 걱정할 필요가 없습니다.
Lua는 가비지 수집기를 실행하여 모든 죽은 객체(즉, Lua에서 더 이상 접근할 수 없는 객체)를 수집하여 자동 메모리 관리 작업을 완료합니다. . 문자열, 테이블, 사용자 데이터, 함수, 스레드, 내부 구조 등 Lua에서 사용되는 모든 메모리는 자동으로 관리됩니다.
Lua는 증분 마크 스캔 수집기를 구현합니다. 가비지 수집 주기를 제어하기 위해 가비지 수집기 간격 속도와 가비지 수집기 단계 속도라는 두 숫자를 사용합니다. 두 숫자 모두 백분율 단위로 표시됩니다(예: 값 100은 내부적으로 1을 나타냄).
가비지 수집기 일시 중지 비율은 새 주기를 시작하기 전에 수집기가 기다려야 하는 시간을 제어합니다. 이 값을 늘리면 수집기가 덜 공격적이게 됩니다. 이 값이 100보다 작으면 수집기는 새 주기를 시작하기 전에 기다리지 않습니다. 이 값을 200으로 설정하면 수집기는 새 주기를 시작하기 전에 총 메모리 사용량이 이전 값의 두 배에 도달할 때까지 기다리게 됩니다.
가비지 수집기 단계 속도는 메모리 할당 속도에 비해 수집기가 작동하는 속도를 제어합니다. 이 값을 늘리면 수집기가 더욱 공격적으로 변할 뿐만 아니라 각 증분 단계의 길이도 늘어납니다. 이 값을 100보다 작게 설정하지 마십시오. 그렇지 않으면 수집기가 너무 느리게 작동하여 주기를 완료하지 못합니다. 기본값은 200 입니다. 이는 수집기가 메모리 할당보다 "두 배" 빠르게 작동함을 의미합니다.
단계 승수를 매우 큰 숫자(프로그램에서 사용할 바이트 수보다 10% 더 큰 숫자)로 설정하면 수집기가 세계 정지 수집 장치처럼 작동합니다. 그런 다음 일시 중지 비율을 200으로 설정하면 수집기는 Lua의 이전 버전과 동일하게 작동합니다. Lua가 사용된 메모리를 두 배로 늘릴 때마다 전체 수집이 수행됩니다.
가비지 수집기 기능
Lua는 자동 메모리 관리를 제어하기 위해 collectgarbage ([opt [, arg]]) 기능을 제공합니다.
collectgarbage("collect"): 전체 가비지 수집 주기를 수행합니다. opt 매개변수를 통해 다양한 기능 세트를 제공합니다:
collectgarbage("count"): Lua에서 사용한 총 메모리를 K 바이트 수로 반환합니다. 이 값에는 소수 부분이 있으므로 1024를 곱하면 Lua에서 사용하는 정확한 바이트 수를 얻을 수 있습니다(오버플로 제외).
collectgarbage("restart"): 가비지 수집기의 자동 작동을 다시 시작합니다.
collectgarbage("setpause"): arg를 수집기의 일시 중지 속도로 설정합니다(§2.5 참조). 간격 비율의 이전 값을 반환합니다.
collectgarbage("setstepmul"): 단계 배율의 이전 값을 반환합니다.
collectgarbage("step"): 가비지 수집기를 한 단계로 실행합니다. "크기" 단계는 arg에 의해 제어됩니다. 0이 전달되면 수집기는 (분할할 수 없는) 한 단계씩 진행됩니다. 0이 아닌 값을 전달하면 수집기는 이러한 많은(K 바이트) 메모리를 할당하는 Lua와 동일한 작업을 수행합니다. 수집기가 루프를 종료하면 true를 반환합니다.
collectgarbage("stop"): 가비지 수집기를 중지합니다. 콜렉터는 재시작을 호출하기 전의 명시적 호출에 대해서만 실행됩니다.
다음은 간단한 가비지 수집 예를 보여줍니다.
mytable = {"apple", "orange", "banana"} print(collectgarbage("count")) mytable = nil print(collectgarbage("count")) print(collectgarbage("collect")) print(collectgarbage("count"))
위 프로그램을 실행하면 출력 결과는 다음과 같습니다(메모리 사용량 변경 참고).
아아아아