Python 가비지 수집 메커니즘에 대한 자세한 설명: 참조 계산 및 순환 가비지 수집기

Python 가비지 수집 메커니즘

Python 프로그래밍 언어는 자동 가비지 수집 메커니즘을 채택하여 더 이상 필요하지 않은 개체를 자동으로 해제하고 해당 개체가 차지한 메모리를 다른 프로그램에서 사용할 수 있도록 운영 체제로 반환할 수 있습니다. 이는 프로그래머가 수동으로 메모리를 해제할 필요가 없기 때문에 프로그래머의 부담을 어느 정도 덜어줍니다.

참조 카운팅 메커니즘

Python은 주로 가비지 수집 메커니즘의 일부로 참조 계산을 사용합니다. 모든 객체에는 해당 객체를 참조하는 변수 수를 기록하는 참조 카운터가 있습니다. 참조 카운터가 0에 도달하면 개체를 참조하는 변수가 없으며 개체는 가비지 개체가 되어 가비지 수집 메커니즘에 의해 자동으로 삭제된다는 의미입니다.

다음은 참조 계산 메커니즘이 어떻게 작동하는지 보여주는 간단한 예입니다.

class Person:
    def __init__(self, name):
        self.name = name

    def __del__(self):
        print(f'{
      
      self.name}对象被删除了')

# 创建两个对象,并相互引用
p1 = Person('Alice')
p2 = Person('Bob')

# 打印两个对象的引用计数器
print(sys.getrefcount(p1))  # 输出结果为2,包括p1和参数传递中的临时引用
print(sys.getrefcount(p2))  # 输出结果为2

# 断开对象之间的相互引用
p1 = None
p2 = None

# 观察析构函数的调用情况

위의 예에서는 Person 클래스를 정의하고 두 개의 개체 p1과 p2를 만들고 서로 참조했습니다. 이 함수를 사용하여 sys.getrefcount()객체의 참조 횟수를 가져옵니다. 마지막으로 p1과 p2의 참조를 None으로 설정하여 이들 간의 상호 참조를 끊습니다. 이때 __del__메소드가 호출되면서 객체가 삭제되었다는 메시지가 출력되는 것을 확인할 수 있다.

원형 가비지 수집기

참조 계산 메커니즘 외에도 Python은 순환 가비지 수집기(Cycle GC)를 사용하여 순환 참조를 처리합니다. 순환 참조는 두 개 이상의 개체가 다른 개체를 참조하지 않고 서로 참조하여 해당 개체에 액세스할 수 없을 때 발생합니다. 순환 가비지 수집기는 주기적으로 메모리의 개체를 검색하여 순환 참조를 감지하고 액세스할 수 없는 개체를 정리합니다.

다음은 순환 참조의 예입니다.

class A:
    def __init__(self, b):
        self.b = b

class B:
    def __init__(self, a):
        self.a = a

# 创建两个对象,并相互引用形成循环引用
a_obj = A(None)
b_obj = B(a_obj)
a_obj.b = b_obj

# 对象无法通过其他引用访问到
a_obj = None
b_obj = None

# 手动进行垃圾回收
gc.collect()

이 예에서는 순환 참조를 형성하면서 서로를 참조하는 두 개의 개체 a_obj및 를 만듭니다 . b_obj해당 참조가 없음으로 설정되어 있어도 이러한 개체는 다른 참조를 통해 액세스할 수 없습니다. 수동 호출은 gc.collect()강제로 가비지 수집을 수행하고 액세스할 수 없는 개체를 정리할 수 있습니다.

대부분의 경우 수동 가비지 수집 작업이 필요하지 않다는 점에 유의하는 것이 중요합니다. Python의 가비지 수집 메커니즘은 적절한 경우 자동으로 실행됩니다. 수동으로 호출하는 가비지 수집은 일반적으로 메모리 사용을 최적화하기 위해 많은 수의 개체가 생성되고 삭제되는 경우와 같은 일부 특수한 상황에서 사용됩니다.

Python의 가비지 수집 메커니즘을 이해함으로써 프로그래머는 메모리를 더 잘 관리하고 코드의 효율성과 유지 관리성을 향상시킬 수 있습니다.

요약

Python의 순환 가비지 수집기는 객체 간에 순환 참조가 있을 때 작동합니다. 순환 가비지 수집기는 표시 및 청소라는 또 다른 전략을 사용합니다. 순환 가비지 수집기의 작동 방식은 다음과 같습니다.

  1. 표시 단계: 순환 가비지 수집기는 루트 개체부터 시작하여 도달 가능한 모든 개체를 순회하고 해당 개체를 "활성"으로 표시합니다.
  2. 정리 단계: 순환 가비지 수집기는 힙 메모리의 모든 개체를 검색하고 표시되지 않은 개체를 가비지 개체로 결정하고 해당 메모리 공간을 회수합니다.

순환 가비지 수집기의 실행 타이밍은 Python 인터프리터에 의해 자동으로 제어됩니다. 임계값을 초과하는 메모리 사용량, CPU가 유휴 상태인 경우 등 특정 조건에 도달하면 Python 인터프리터는 순환 가비지 수집기의 실행을 트리거합니다.

순환 가비지 수집기의 작업으로 인해 특정 성능 오버헤드가 발생한다는 점에 유의해야 합니다. 따라서 코드를 작성할 때 가비지 수집의 빈도와 오버헤드를 줄이기 위해 순환 참조를 피해야 합니다.

게다가 Python은 gc가비지 수집을 더욱 세밀하게 제어할 수 있는 모듈도 제공합니다. gc모듈의 관련 매개변수를 조정하여 순환 가비지 수집기 비활성화, 가비지 수집 임계값 설정 등과 같은 가비지 수집 동작을 변경할 수 있습니다 . 구체적인 사용 방법은 공식 Python 설명서를 참조하세요.

요약하면 Python의 가비지 수집 메커니즘에는 주로 참조 계산 및 순환 가비지 수집기가 포함됩니다. 참조 카운팅은 객체의 참조를 추적하는 데 사용됩니다. 객체를 참조하는 변수가 없으면 객체가 해제됩니다. 순환 가비지 수집기는 순환 참조가 존재하는 상황을 처리하여 액세스할 수 없는 개체를 표시하고 지웁니다. 이 두 가지 메커니즘을 통해 Python은 자동으로 메모리를 관리하고 가비지 수집을 수행하여 프로그래머의 부담을 줄일 수 있습니다.

자세한 설명과 실제 작동

1. 프로그램 내 쓰레기 문제

프로그램이 실행되는 동안 쓰레기가 생성되며, 이 쓰레기는 프로그램 성능에 영향을 미칩니다. 그러므로 우리는 이러한 쓰레기를 제때에 청소해야 합니다.

2. 쓰레기의 정의

프로그램에서 참조되지 않는 개체는 가비지로 간주됩니다. 쓰레기 개체가 너무 많으면 프로그램 성능에 영향을 미칩니다.

3. 자동 쓰레기 수집 메커니즘

Python에는 자동 가비지 수집 메커니즘이 있습니다. 참조되지 않는 객체를 자동으로 삭제하므로 가비지 수집을 수동으로 처리할 필요가 없습니다.

4. 예: del 메소드를 사용하여 가비지 객체 삭제

다음은 del 메소드를 사용하여 가비지 객체를 삭제하는 방법을 보여주는 샘플 코드입니다.

class A:
    def __init__(self):
        self.name = 'A类'

    # del是一个特殊方法,它会在对象被垃圾回收前调用
    def __del__(self):
        print('A()对象被删除了~~~',self)

a = A()
b = a # 又使用一个变量b,来引用a对应的对象

print(a.name)

5. 가비지 수집을 수동으로 처리합니다.

가비지 수집을 수동으로 처리하려면 개체의 참조를 None으로 설정하거나 del 문을 사용하여 참조를 삭제할 수 있습니다. 샘플 코드는 다음과 같습니다.

# 将a设置为了None,此时没有任何的变量对A()对象进行引用,它就是变成了垃圾
a = None
b = None

6. 프로그램 종료

마지막으로, 프로그램이 실행된 후 사용자 입력이 종료될 때까지 기다리기 위해 코드 끝에 입력 문 줄을 추가할 수 있습니다.

input('回车键退出...')

7. 가비지 수집 자동 처리

Python의 가비지 수집 메커니즘은 수동 처리 없이 참조되지 않는 객체를 자동으로 삭제합니다. 샘플 코드는 다음과 같습니다.

# 定义一个类A
class A:
    def __init__(self):
        self.name = 'A类'

    # del是一个特殊方法,它会在对象被垃圾回收前调用
    def __del__(self):
        print('A()对象被删除了~~~',self)

# 创建一个A类的实例a并引用它
a = A()

# 打印a的名称属性值
print(a.name)

# 删除a的引用
a = None

# 程序运行结束后,会自动调用垃圾回收机制删除没有被引用的对象

프로그램이 종료되면 Python은 자동으로 가비지 수집 메커니즘을 호출하여 참조되지 않은 객체를 삭제합니다. 샘플 코드에서 a의 참조가 None으로 설정되면 객체 a는 가비지 객체가 되어 결국 가비지 수집 메커니즘에 의해 삭제된다는 것을 알 수 있습니다.

8. 프로그램 종료

마지막으로, 프로그램이 실행된 후 사용자 입력이 종료될 때까지 기다리기 위해 코드 끝에 입력 문 줄을 추가할 수 있습니다.

input('回车键退出...')

추천 Python 부티크 칼럼


Python의 기본 지식(0 기본 소개)

[파이썬 기초지식] 0.print() 함수
[파이썬 기초지식] 1. 데이터 유형, 데이터 활용, 데이터 변환
[파이썬 기초지식] 2. if 조건 판단 및 조건 중첩
[파이썬 기초지식] 3.input() 함수
[파이썬 기본 지식] 4. 목록 및 사전
[파이썬 기본 지식] 5. For 루프 및 while 루프
[파이썬 기본 지식] 6. 불리언 값과 4가지 문장 유형(break, continue, pass, else)
[파이썬 기초지식] 7. 실습 - 파이썬을 이용한 '워드PK' 게임 구현 (1)
[파이썬 기초] 7. 실습 - 파이썬을 이용한 '워드PK' 게임 구현 (2)
[파이썬 기초] 8. 프로그래밍 사고: 문제 해결 방법 - 생각하기 편
[파이썬 기초지식] 9. 함수의 정의와 호출
[파이썬 기초지식] 10. 함수를 활용한 프로그램 작성 - 실전편
[파이썬 기초지식] 10. 파이썬 사용하기 가위바위보 게임 구현하기 - 함수 실습 연산 챕터
[파이썬 기초] 11. 디버깅 방법 - 일반적인 오류 원인 및 해결 방법 - 생각하기 챕터
[파이썬 기초] 12. 클래스와 객체 (1)
[파이썬 기초] 12 클래스와 객체(2)
[파이썬 기초] 지식] 13. 클래스와 객체(3)
[파이썬 기초지식] 13. 클래스와 객체(4)
[파이썬 기초지식] 14. 라이브러리 관리 시스템 구축(실습) 클래스와 객체의 연산)
[파이썬 기본지식] 15. 코딩 기초지식
[파이썬 기초지식] 16. 파일 읽기, 쓰기 및 연산의 기초
[파이썬 기초지식] 16. "고대시 받아쓰기 문제"의 파이썬 구현 (파일 읽기, 쓰기, 코딩 - 실습)
[파이썬 기초지식] 17. 모듈의 개념과 소개 방법
[파이썬 기초] 18. 실무 - 파이썬을 이용한 대량 이메일 자동 발송
[파이썬 기초] 19. 제품 사고와 순서도 활용 - 사고
[파이썬 기초] 20. 파이썬 구현 "점심으로 뭘 먹을까" ( 프로덕트 씽킹 - 실무)
[파이썬 기본지식] 21. 효율적이고 게으르게 여는 올바른 방법 - 졸업
[파이썬 파일 처리] CSV 파일 읽기, 처리, 쓰기
[파이썬 파일 처리 ] 엑셀 자동처리 (openpyxl 활용)
[파이썬 파일 처리]-엑셀 형식 처리


Python 크롤러 지식

[python 크롤러] 1. 크롤러 기본 지식
[python 크롤러] 2. 웹 페이지 기본 지식
[python 크롤러] 3. 크롤러 첫 경험 (BeautifulSoup 분석)
[python 크롤러] 4. 실제 크롤러 작업 (디쉬 크롤링)
[python 크롤러] 5 .실전 크롤러 작업(크롤링 가사)
[파이썬 크롤러] 6. 실제 크롤러 작업(파라미터로 데이터 요청)
[파이썬 크롤러] 7. 크롤링된 데이터는 어디에 저장되나요?
[파이썬 크롤러] 8. 과거를 복습하고 새로 배운다
[파이썬 크롤러] 9. 쿠키(쿠키)로 로그인
[파이썬 크롤러] 10. 브라우저에 자동으로 작동하도록 명령(셀레늄)
[파이썬 크롤러] 11. 크롤러를 시키자 제때 보고해
[파이썬 크롤러] 12. 나만의 크롤러 군대 만들기
[파이썬 크롤러] 13. 살찌지 않고 먹을 수 있는 것 (크롤러 실습)
[파이썬 크롤러] 14. 스크래피 프레임워크 설명
[파이썬 크롤러] 15. 스크래피 프레임워크 실습 (인기 직업 크롤링 테이크)
[파이썬 크롤러] 16. 크롤러 지식 포인트 요약 및 복습

추천

출처blog.csdn.net/qq_41308872/article/details/132856848