이제 와서 정리해보는 파이썬과 자바의 GC(garbage Collector)
자바에는 유명한 가비지 컬렉터가 있다.
하지만 왜인지 나는 파이썬에는 없다고 생각했다 왜 그런 바보같은 생각을 했을까?
그래서 지금 다시 알아보고 다시 정리해보려고 나를 위해 기록한다.
자바와 파이썬은 둘 다 메모리 관리를 자동으로 처리하는 가비지 컬렉터를 사용합니다.
가비지 컬렉션은 프로그램 실행 중에 더 이상 필요하지 않은 객체를 메모리에서 자동으로 해제 하여 메모리 누수를 방지하는 중요한 기능입니다.
두 언어에서 가비지 컬렉터의 작동 방식은 다소 다르며, 자세히 설명해보겠습니다.
JAVA의 가비지 컬렉터
자바는 명시적으로 메모리 할당, 해제 할 필요가 없습니다. 자바 가비지 컬렉터는 힙 메모리에서 더 이상 사용되지 않는 객체를 자동으로 찾아내고 회수합니다.
자바는 Generational garbage collection 개념을 사용합니다. 힙 메모리는
세 가지 세대로 나뉩니다.
Young generation: 새롭게 생성된 객체들이 할당됩니다.
Eden space와 두개의 Survivor Space로 나누어집니다. Edn 에서 시작해, 살아남은 객체들은 Survivor space로
이동합니다.
old generation: Young Generation에서 살아남은 오래된 객체들이 이곳으로 이동합니다.
permanent Generation: 8이상붙어 metaspace
. 가비지 컬렉션의 과정
- Minor GC: Young Generation에서 발생하며, Eden Space에서 살아남은 객체는 Survivor Space로 이동합니다.
- Major GC: Old Generation에서 발생하며, Young Generation을 거친 객체가 더 이상 필요하지 않을 때 이들을 청소합니다. Major GC는 성능에 큰 영향을 줄 수 있습니다.
public class GarbageCollectorExample {
public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
String temp = new String("Garbage Collection");
// temp는 for loop 안에서만 사용되므로 loop가 끝나면 더 이상 참조되지 않음
}
// 강제로 가비지 컬렉션을 실행해보려면 System.gc()를 호출할 수 있지만,
// 이는 가비지 컬렉터를 반드시 실행하라는 보장은 하지 않음
System.gc();
}
}
여기서 보면 temp는 다 돌면 가비지 컬렉터에 의해 회수 될 수 있습니다.
파이썬(Python)의 가비지 컬렉터
1. 기본 개념
파이썬은 자바와 마찬가지로 자동 메모리 관리를 지원하지만, 가비지 컬렉션을 위해 **참조 카운팅(Reference Counting)**과 **순환 검출(Cycle Detection)**이라는 두 가지 주요 메커니즘을 사용합니다.
와 이걸 모르고 자바가 더 가비지 컬렉터를 쓴다고 생각을 했다니..
외우자 참조 카운팅 (Reference Counting) , 순환 검출 (Cycle Detection)
2. 참조 카운팅
파이썬 객체는 각 객체가 몇 개의 참조를 받고 있는지 참조 카운터를 유지합니다. 참조 카운트가 0이 되면 해당 객체는 가비지 컬렉터에 의해 즉시 메모리에서 해제됩니다.
3. 순환검출
참조 카운팅은 순환 참조 문제를 해결하지 못합니다. 따라서 파이썬은 순환 참조를 해결하기 위해 주기적으로 힙 메모리를 검사하여 순환 참조를 감지하고 이를 해제하는 알고리즘을 실행합니다.
import gc
class Node:
def __init__(self, value):
self.value = value
self.ref = None
def create_cycle():
node1 = Node(1)
node2 = Node(2)
node1.ref = node2
node2.ref = node1
# node1과 node2는 서로를 참조하므로 참조 카운트는 0이 아니지만, 순환 참조로 인해
# 이들은 사용되지 않음에도 메모리에서 해제되지 않을 수 있음
# 순환 참조를 생성하는 함수 호출
create_cycle()
# 가비지 컬렉터를 강제로 호출하여 순환 참조를 제거
gc.collect()
위의 예시에서 create_cycle() 함수는 두 개의 Node 객체가 서로를 참조하는 순환 참조를 만듭니다. 이 객체들은 가비지 컬렉터에 의해 감지되고 회수됩니다.
차이점 요약
- 기본 방식: 자바는 주로 세대별 가비지 컬렉션을 사용하고, 파이썬은 참조 카운팅과 순환 검출을 사용합니다.
- 세대별 관리: 자바는 객체의 생존 기간에 따라 힙 메모리를 나누어 관리하며, 파이썬은 이러한 구분 없이 참조 관계를 중심으로 관리합니다.
- 가비지 컬렉션 트리거: 자바는 특정 메모리 사용량에 도달했을 때 가비지 컬렉션이 실행되며, 파이썬은 참조 카운트가 0이 되거나 순환 참조가 발생했을 때 실행됩니다.