티스토리 뷰
이 포스팅에서는 파이썬의 Garbage collection 이 어떻게 이루어 지는지, 간단히 설명한다.
Garbage collection: 프로그램이 자동으로 메모리 공간을 비워주는 것. (=Memory recycling)
Reference: 참조, 특정 메모리 공간을 다른 곳에서 포인터 형식으로 가져다 쓸때 그것을 "참조 하고 있다" 고 표현한다.
파이썬은 아래의 2가지 방식을 활용하여 Garbage Collection 을 수행한다.
1. Reference counting
- 모든 파이썬 object 는 reference count 라는 것을 가지고 있다.
- 이것은 다른 곳에서 이 object 를 참조하는 개수로서, 0보다 크다면 어디선가 이 object 를 사용중이라는 것을 뜻한다.
- 그래서 Garbage collection 시에는, 이 Reference count == 0 가 되면 object 를 삭제 한다.
- Cascading effect : 삭제가 일어날때, 참조가 꼬리에 꼬리를 무는경우가 많아 동시에 메모리에서 해제 되는경우가 비일비재 하다.
- Reference count 하나만 체크 해서는 cyclical reference 에 대한 garbage collection 을 처리할 수 없다.
- 일반적으로 Thread safe 하지 못하다. 즉, 파이썬으로 멀티 스레딩을 하게되면 이 reference count 가 제대로 카운팅 하지 못하여 garbage collection 이 되지 못한다. (자세한 내용이 궁금하다면 파이썬 GIL 을 찾아보자)
- 즉 파이썬은 multi-threading < multi-processing ...
2. Tracing
- Mark and sweep 방식 사용 : 사용중인 object 를 마킹 하고 마킹 안된 것들을 다 지우는 방법
- 파이썬은 그 중에서도 Generational Garbage Collection 이라는 용법을 씀
- "대부분의 object 들이 일찍 죽는다" 라는 성질을 이용 (한번 쓰이고 마는 애들이 많다는 뜻)
- 파이썬 프로세스가 생성될때 3개의 generation list 를 만듬 (generation 0, generation 1, generation 2)
- 최근에 생성된 object 일수록 generation 숫자가 작다 (최초 생성 시, generation 0 에 속함)
- 각 리스트는reference count 가 0보다 큰 것들만 담아두고 있음
- 각각의 list 는 길이에 대한 threshold 값을 가지고 있어서 그 값을 넘어서면, 해당 generation list 를 포함 하여 younger list 들도 함께 generational garbage collection을 수행. (= 리스트 오브젝트들의 cyclic reference 를 체크 하여 일괄 삭제 작업을 수행)
- generation 0 이 조금 더 빈번하게 clean 작업을 수행
- garbage collection 이 끝났는데 해당 generation list 에서 살아남은 object 들은 next generation 으로 승격
- generation 2 이상으로 승격된 애들은 프로세스가 죽을때까지 살아있게 된다.
- End -
'Python' 카테고리의 다른 글
[Python] 인스턴스 메소드의 종류와 용법 (Instance methods): Public, Protected, Private 접근제어자 (Access Modifiers) (0) | 2019.04.08 |
---|---|
[파이썬] class method 와 static method (0) | 2019.04.06 |
Django ORM - DB Select 시, String concat 하기. (문자열 합치기) (0) | 2016.11.02 |
virtualenv 로 파이썬 가상환경 설정하기 (0) | 2016.10.30 |
[Python] 파이썬 에러 핸들링 (try-except 구문) (0) | 2016.10.28 |