본문 바로가기
Programming/Python

Python에서의 메모리 관리와 가비지 컬렉션

by BTC_박현영 2023. 10. 27.

Python은 메모리 관리와 가비지 컬렉션에 대한 효율적인 시스템을 갖추고 있습니다. 이러한 메모리 관리 체계는 Python 프로그램의 성능과 안정성에 큰 영향을 미칩니다. 이번에는 Python의 메모리 관리 체계와 가비지 컬렉션에 대해 알아보겠습니다.

 

Python의 메모리 할당

Python에서 객체가 생성될 때마다, 해당 객체에 대한 메모리가 동적으로 할당됩니다. Python의 내부 메모리 할당자는 이러한 객체 생성 및 삭제를 효율적으로 처리하기 위한 여러 전략을 사용합니다.

 

참조 카운트

Python의 주요 메모리 관리 방식 중 하나는 참조 카운팅입니다. 객체가 다른 객체에 참조될 때마다 해당 객체의 참조 카운트가 증가하고, 참조가 해제될 때마다 감소합니다. 참조 카운트가 0이 되면 해당 객체는 메모리에서 해제됩니다.

 

가비지 컬렉션: 순환 참조 문제 해결

참조 카운팅만으로는 메모리 누수 문제를 완전히 해결할 수 없습니다. 특히 순환 참조가 발생할 경우, 참조 카운트는 0이 되지 않음에도 불구하고 객체가 메모리에서 해제되지 않는 문제가 발생할 수 있습니다. Python은 이러한 문제를 해결하기 위해 가비지 컬렉션을 사용합니다.

 

순환 참조는 두 개 이상의 객체가 서로를 참조하는 상황을 말합니다. 이렇게 되면 각 객체의 참조 카운트는 0보다 크기 때문에, 각 객체가 메모리에서 자동으로 해제되지 않게 됩니다. 이로 인해 메모리 누수가 발생할 수 있습니다.

간단한 예를 들어 설명하겠습니다:

class MyClass:
    def __init__(self):
        self.circular_ref = None

# 두 객체 생성
objA = MyClass()
objB = MyClass()

# objA가 objB를 참조하도록 설정
objA.circular_ref = objB

# objB가 objA를 참조하도록 설정
objB.circular_ref = objA

위의 예제에서 objA는 objB를 참조하고, objB는 objA를 참조합니다. 따라서 두 객체 모두 참조 카운트가 1입니다. 이 상태에서 다른 코드나 함수에서 두 객체 모두에 대한 참조를 제거하더라도, 두 객체는 서로를 계속 참조하고 있기 때문에 참조 카운트가 0이 되지 않습니다. 결과적으로 이러한 객체들은 메모리에서 해제되지 않아 메모리 누수가 발생하게 됩니다.

Python의 가비지 컬렉터는 이러한 순환 참조 문제를 해결하기 위해 개발되었습니다. 가비지 컬렉터는 프로그램 실행 중에 주기적으로 메모리를 스캔하여 이런 순환 참조 상황을 탐지하고, 관련 객체들을 안전하게 메모리에서 해제합니다.

 

 

가비지 컬렉션 동작 방식

Python의 가비지 컬렉터는 주기적으로 실행되며, 순환 참조를 감지하고 관련된 객체들을 안전하게 메모리에서 해제합니다. 이는 객체 간의 참조 관계를 분석하여, 더 이상 접근할 수 없는 객체들을 탐지하고 삭제하는 방식으로 동작합니다.

메모리 최적화

메모리는 한정된 리소스이므로 효과적인 관리가 필요합니다. 특히 큰 데이터를 다루는 애플리케이션에서는 메모리 사용량에 따라 성능이 크게 달라질 수 있습니다. Python에서는 몇 가지 기법을 사용하여 메모리 사용량을 최적화할 수 있습니다.

 

1. del 키워드 사용

Python에서 객체에 대한 참조를 제거할 때 del 키워드를 사용할 수 있습니다. del 키워드는 해당 객체에 대한 참조를 삭제하므로, 해당 객체의 참조 카운트가 감소하게 됩니다. 참조 카운트가 0이 되면 그 객체는 메모리에서 해제됩니다.

 

2. gc 모듈 활용

Python의 가비지 컬렉션은 gc 모듈을 통해 제어할 수 있습니다. 가비지 컬렉션은 순환 참조가 발생한 객체들을 정리하는 역할을 합니다.

gc.collect() 메서드는 가비지 컬렉션을 강제로 실행하게 합니다. 메모리가 부족하거나 특정 시점에서 메모리를 정리하고 싶을 때 사용할 수 있습니다.

 

가비지 컬렉션 비활성화
특정 상황에서는 가비지 컬렉션의 자동 실행이 성능에 영향을 줄 수 있습니다. 이런 경우 gc.disable()를 사용하여 가비지 컬렉션을 일시적으로 비활성화할 수 있습니다. 다만, 이 기능을 사용할 때는 메모리 누수에 주의해야 합니다.

 

메모리 최적화는 프로그램의 성능과 안정성에 큰 영향을 미칩니다. Python에서 제공하는 del 키워드와 gc 모듈을 적절하게 활용하면 효과적인 메모리 관리가 가능합니다. 항상 프로그램의 특성과 필요성을 고려하여 최적의 메모리 관리 전략을 선택해야 합니다.


참고 자료
Python 공식 문서: Memory Management
Python Garbage Collection

'Programming > Python' 카테고리의 다른 글

Python의 데코레이터  (0) 2023.11.24
Python의 타입 힌트  (0) 2023.11.10
Python에서의 비동기 프로그래밍  (0) 2023.10.12
Pandas & Numpy  (0) 2023.09.27
Streamlit - Kaggle DALYs 데이터 분석 & 시각화 - 3  (0) 2023.09.15

댓글