lua gc
3346 단어 lua
Lua는 증분 표시가 지워진 수집기를 실현했다.그것은 쓰레기 수집 주기를 두 개의 숫자로 제어한다. 그것이 바로 가바지-collector pause와 가바지-collector step multiplier이다.
garbage-collector pause는 수집기가 새로운 수집 주기를 시작하기 전에 얼마나 기다려야 하는지를 제어합니다.숫자가 증가함에 따라 수집기 작업이 그다지 주동적이지 않게 되었다.1보다 작은 값은 컬렉터가 새 주기를 시작할 때 더 이상 기다리지 않는다는 것을 의미한다.값이 2일 때는 총 사용 메모리 수량이 원래의 두 배에 달할 때 새로운 주기를 여는 것을 의미한다.
step multiplier는 수집기의 상대적인 메모리 분배 속도를 제어합니다.더 큰 숫자는 수집기가 더욱 주동적으로 작동하는 동시에 단계별로 수집되는 사이즈를 증가시킬 것이다.1보다 작은 값은 컬렉터를 매우 느리게 만들어서 컬렉터가 현재 주기를 영원히 끝내지 못할 수도 있다.기본값은 2이며 이는 컬렉터가 메모리 분배기의 두 배속으로 실행된다는 것을 의미한다.
C에서 루아를 호출할 수 있습니다gc 또는 Lua에서 collectgarbage를 호출해서 이 숫자를 바꿉니다.둘 다 백분율 값을 받아들인다. 따라서 매개 변수 100은 실제 값 1을 의미한다.이 함수들을 통해 수집기를 직접 제어할 수도 있다. (예를 들어 멈추거나 다시 시작할 수도 있다.)
C API를 사용하면 userdata에 쓰레기 수집 메타데이터를 설정할 수 있습니다.이 원법도 끝자라고 불린다.종료자는 추가 자원 관리자와 루아의 메모리 관리자로 협동해서 작업할 수 있도록 합니다. (예를 들어 파일, 네트워크 연결, 데이터베이스 연결, 또는 자신의 메모리를 방출할 수도 있습니다.)
사용자 데이터 Metatable 에 __gc 필드가 있으면 쓰레기 수집기는 즉시 회수하지 않습니다.대신 루아는 그것들을 목록에 넣었다.Lua는 수집이 완료되면 목록에 있는 각 userdata에 대해 다음과 같은 값을 적용합니다.
function gc_event (udata)
local h = metatable(udata).__gc
if h then
h(udata)
end
end
모든 쓰레기 수집 주기의 끝에 현재 주기에 수집된userdata의 끝은 그것들이 구성할 때의 역순으로 호출됩니다.즉, 수집 목록에서 프로그램에서 마지막으로 만들어진userdata의 끝은 첫 번째로 호출된다는 것이다.
스팸 수거기는 응용 프로그램의 메모리 분배와 방출을 관리하는 데 쓰인다.쓰레기 수거기가 나타나기 전에 프로그래머는 메모리를 사용할 때 시스템에 메모리 공간을 신청해야 한다.Visual Basic과 같은 일부 언어는 시스템에 메모리 공간을 요청하는 작업을 자동으로 완료합니다.그러나 Visual C++ 같은 언어에서는 프로그램 코드에 메모리 공간을 요청해야 합니다.만약 프로그래머가 메모리를 사용한 후에 메모리를 방출하는 것을 잊어버리면 메모리 유출을 일으킬 것이다.그러나 쓰레기 수거기가 생기면 프로그래머는 메모리의 대상이 생존 기간을 떠난 후 방출되는지 여부에 신경 쓸 필요가 없다.프로그램이 실행될 때 쓰레기 수거기는 위탁 관리 더미를 설치한다.트랜지스터는 C 언어의 트랜지스터와 유사하지만, 프로그래머는 트랜지스터에서 대상을 방출할 필요가 없고, 트랜지스터에서 대상의 저장은 연속적이다.개발자가 new 연산자를 사용하여 대상을 만들 때마다 라이브러리는 이 대상에게 메모리를 할당합니다.새로 작성한 객체는 마지막으로 작성한 객체 뒤에 배치됩니다.쓰레기 수거기는 트랜지스터 더미의 마지막 대상 뒤에 있는 메모리 공간을 가리키는 바늘을 저장합니다.새로운 대상이 생겼을 때, 라이브러리는 새로운 대상을 메모리의 어디에 두어야 하는지 알 수 있다.동시에 개발자는 같은 유형의 대상을 함께 놓아야 한다.예를 들어 개발자가 데이터베이스에 데이터를 쓰기를 원할 때 먼저 연결 대상을 만들고 그 다음에 Command 대상, 마지막으로DataSet 대상을 만들어야 한다.만약 이 대상들이 트랜지스터 더미와 인접한 구역에 놓여 있다면, 그것들을 매우 빨리 저장할 수 있을 것이다.쓰레기 수거기의 바늘이 트랜지스터 더미 이외의 메모리 공간을 가리킬 때 메모리 속의 쓰레기를 회수해야 한다.이 과정에서 쓰레기 수거기는 우선 위탁 관리 더미에 있는 모든 대상이 회수되어야 한다고 가정한다.그 다음에 트레이드 더미에서 루트 대상이 인용되는 대상을 찾습니다. (루트 대상은 전역, 정적, 또는 활동 중인 국부 변수, 레지스터가 가리키는 대상) 찾은 다음에 유효한 대상의 목록에 추가하고, 검색한 대상에서 새로 추가된 유효한 대상이 인용되는지 찾습니다.쓰레기 수거기가 모든 대상을 검사한 후에 루트 대상과 루트 대상이 직접 또는 간접적으로 인용된 대상의 목록이 있고, 테이블에 없는 다른 대상은 메모리에서 회수된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Neovim을 위한 자동 완성NeoVim으로 생산성을 높일 수 있는 가장 멋진 기능 중 하나는 자동 완성이므로 성능에 따라 플러그인을 선택할 수 있습니다. YouCompleteMe Coc.nvim 이 플러그인은 사용하기 좋지만 Javascrip...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.