본문 바로가기
Computer Science

#5 python의 메모리 할당과 관리 (Garbage Collection)

by 데이터현 2021. 12. 30.

https://hkim-data.tistory.com/183

 

#4 python의 메모리 할당과 관리 (Class와 self)

https://hkim-data.tistory.com/182 #3 python의 메모리 할당과 관리 (Stack & Heap Memory) https://hkim-data.tistory.com/181 #2 python의 메모리 할당과 관리 (Everything is object in Python) 2021.12.29 -..

hkim-data.tistory.com

지난 포스팅에 이어 이번엔 python의 가비지 컬렉션이 어떻게 동작하는지 알아보도록 하겠다.

 

python에서는 가비지 컬렉션을 레퍼런스 카운팅을 통해 Number of references가 0이 될 때 메모리 할당을 해제한다.

 

그럼, 다음 예시를 통해 실제로 어떻게 동작하는지 알아보도록 하겠다.

 

1. c1 = Car(4)

위의 코드를 수행하게 되면 c1스택 메모리에 생성되어 힙 메모리의 Car 객체를 참조하게 된다.

c1이 Car 객체를 참조한다.

python 인터프리터는 객체와 그 객체의 참조자들의 수를 테이블로 유지한다.

실제로 객체는 binary 형태의 표현이겠지만 지금은 단순하게 보기 위해 Car object 1 이라는 이름을 사용한다.

c1 = Car(4)로 인해 새로운 Car object가 생성되고 참조자도 생성된다.

2. c2 = c1

c2는 c1이 참조하고 있는 Car object1을 동일하게 참조한다.

즉 아래 이미지와 같이 참조한다.

또한,인터프리터 테이블 내의 Car object 1에 대한 참조자의 숫자도 증가하게 된다.

3. c1 = None

위 명령어로 인해 c1은 아무 객체도 참조하지 않는다.

4. c2 = Car(4)

c2 가 새로운 Car 클래스의 객체를 참조하게 된다.

즉 기존의 c2 객체가 참조하던 Car object 1 을 참조하는 수가 0이 된다.

따라서 인터프리터 참조 테이블에 새로운 Car object 2에 대한 행이 추가되고

Car object 1 의 참조자는 0 이 되며, Dead Object 가 된다.

가비지 컬렉터는 Reference Counting 알고리즘을 통해 참조자 수가 0 이 되는 즉시 메모리에서 해제시킨다.

Car obejct 1이 힙 메모리에서 해제 됨

레퍼런스 카운팅 방식의 장 단점

reference Count가 0이 될 때마다 GC가 발생하기 때문에 Pause Time이 분산되어 실시간 작업에도 거의 영향을 주지 않고 즉시 메모리에서 해제된다는 장점이 있다.

그러나 단점으로는 각 Object마다 Reference Count를 변경해 주어야 하고 참조를 많이 하고 있는 Object의 Reference Count가 0이 될 경우 연쇄적으로 GC가 발생할 수 있는 문제가 있고 Reference Count의 관리 비용도 크다

 

이제 실제 코드 상에서 확인을 해보자

weakref모듈은 객체에 대한 약한 참조(Weak reference)를 만드는데 사용한다.

약한참조는 변수가 객체를 참조할 때, 참조 카운터를 증가시키지 않고 참조하는 객체를 얻을 수 있다

 

Python과 Java/C 차이

1. 선언

- python은 따로 자료형을 선언하지 않는다(dynamically typed)

- Java/C는 반드시 자료형을 선언해야 함

2. 10은?

- python은 힙 메모리에 생성된다.

- Java/C는 4바이트 또는 2바이트 실제 데이터가 저장된다.

3. x에 뭐가 들어가 있을까?

- python에서는 10 객체를 참조한다.

- Java/C 10 데이터 자체가 들어가 있음

4. x = x + 1을 하면?

- python 에서는 11 객체를 새로 참조함

- Java/C 에서는 동일한 메모리에서 값만 11로 변경

5. x = 10 , y = 10

- python에서는 x와 y 둘다 같은 객체를 참조한다.

- Java/C 에서는 x 와 y 둘이 10이라는 데이터를 다른 메모리에 저장된다.

댓글