* Lua의 메모리 관리 : 가비지 컬렉터(Garbage Collector)
Lua에서는 자동 메모리 관리를 지원한다. Lua는 가비지 컬렉션을 통해 자동으로 메모리를 관리한다. 따라서 메모리를 수동으로 관리하는 관리 과정에서 나타날 수 있는 허상포인터, 메모리 누수에 대해서 자유롭다.
다른 가비지 컬렉터과 다르게 Lua의 가비지 컬렉터은 사이클에 대해 안전하기 때문에 순환하는 자료 구조를 구현할 떄 따로 신경쓰지 않아도 된다.
- 특정 상황에서의 가비지 컬렉션(Garbage Collection)
가비지 컬렉터은 내부 로직에 의해 가비지라고 간주한 메모리만 수집하기 때문에 예상한 것과 다르게 동작할 수 있다.
예를 들어 Stack을 구현할 때 예전에 Pop 되었던 값들이 남아 있을 수 있고, 전역 변수의 경우 사용되지 않는 경우라고 해도 삭제되지 않는다. 이 경우 개발자가 명시적으로 nil을 할당하여 해결할 수 있다.
프로그램에서 컬렉션을 사용하는 경우 컬렉션에 들어있는 객체는 수집되지 않는다. 예를 들어보면 일반적인 테이블에서는 키나 값이 객체일 경우 strong reference이기 때문에 가비지 컬렉터가 수집하지 못한다.
* Weak Table
- 가비지 수집을 허용하는 Weak Table
Weak Table은 객체를 수집할 수 있도록 하기 위한 테이블이다. Weak Table은 모든 객체에 대한 참조를 weak reference로 수행한다. weak reference는 객체에 대한 참조로 가비지 컬렉터가 고려하지 않는 참조이기 때문에 가비지 컬렉터의 가비지 수집을 방지하지 않는다. 따라서 Weak Table에 존재하는 객체는 가비지 컬렉터가 수집할 수 있다.
Weak Table은 키, 값, 키와 값 을 weak reference로 가질 수 있기 떄문에 3종류 존재하며 키나 값이 수집되면 해당 항목이 테이블에서 사라진다.
- Weak Table의 사용 방법
테이블의 필드인 __mode를 통해 Weak Table로 설정할 수 있다.
a = {}
b = {}
setmetatable(a, b)
b.__mode = "k" -- now `a' has weak keys
key = {} -- creates first key
a[key] = 1
key = {} -- creates second key
a[key] = 2
collectgarbage() -- forces a garbage collection cycle
for k, v in pairs(a) do print(v) end
--> 2
객체 타입에만 적용되며 값 타입(정수형 등)은 적용되지 않는다. 문자열 또한 프로그래머 입장에서는 값 타입이기 때문에 동작하지 않는다.
'Lua in Roblox' 카테고리의 다른 글
| [Lua / Roblox] 미니 배틀 로얄 게임 #10 : 인벤토리, 장착, 구조 수정 (0) | 2022.08.04 |
|---|---|
| [Lua / Roblox] 미니 배틀 로얄 게임 #9 : Rojo로 포팅 / 버전 관리 (0) | 2022.07.28 |
| [Lua / Roblox] 미니 배틀 로얄 게임 #8 : 중간 완료된 작업(기록용) (0) | 2022.07.21 |
| [Lua / Roblox] 로블록스 클라이언트 서버 모델 분석 (0) | 2022.07.19 |
| [Lua / Roblox] 미니 배틀 로얄 게임 #7 : 데미지 로직 수정 (0) | 2022.07.18 |