쓰레기 수거 ~에 파이썬 효율적인 메모리 사용을 보장하기 위해 메모리 할당 및 할당 해제를 처리하는 자동 프로세스입니다. 와 같은 언어와는 다르게 기음 또는 C++ 프로그래머가 수동으로 메모리를 할당하고 할당 해제해야 하는 경우 Python은 두 가지 기본 전략을 통해 메모리를 자동으로 관리합니다.
- 참조 카운팅
- 쓰레기 수거
참조 카운팅
파이썬은 참조 카운팅 메모리를 관리하는 것입니다. 각 객체는 자신을 가리키는 참조 수를 추적합니다. 참조 횟수가 0으로 떨어지면, 즉 참조가 남아 있지 않으면 Python은 자동으로 객체 할당을 취소합니다. 예:
Pythonimport sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x))
산출
2 3 2
설명:
- 엑스 처음에 두 번 참조됩니다(x에 의해 한 번, getrefcount()에 의해 한 번).
- 할당 와이 = 엑스 카운트를 증가시킵니다.
- 환경 y = 없음 하나의 참조를 제거합니다.
참조 계산 문제
순환 참조, 즉 순환에서 서로를 참조하는 객체가 있는 경우 참조 계산이 실패합니다. 다른 어떤 것도 그들을 가리키지 않더라도 참조 횟수는 결코 0에 도달하지 않습니다. 예:
Pythonimport sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y))
산출
3 3
설명:
- 엑스 포함 그리고 그리고 그리고 포함 엑스 .
- 삭제한 후에도 엑스 그리고 그리고 Python은 각각이 여전히 다른 것을 참조하기 때문에 참조 계산을 사용하여 메모리를 해제할 수 없습니다.
순환 참조에 대한 가비지 수집
쓰레기 수거 더 이상 액세스할 수 없거나 애플리케이션에서 사용하지 않는 메모리를 자동으로 회수하기 위해 프로그래밍 언어에서 사용되는 메모리 관리 기술입니다. 이러한 순환 참조를 처리하기 위해 Python은 다음을 사용합니다. 가비지 컬렉터 (GC) 내장 gc 모듈에서. 이 수집기는 참조 순환과 관련된 개체를 감지하고 정리할 수 있습니다.
세대별 쓰레기 수거
Python의 세대별 가비지 수집기는 순환 참조를 처리하도록 설계되었습니다. 수명을 기준으로 객체를 3세대로 구성합니다.
- 0세대: 새로 생성된 개체입니다.
- 1세대: 한 번의 수집 주기에서 살아남은 개체입니다.
- 2세대: 수명이 긴 개체입니다.
참조 주기가 발생하면 가비지 수집기가 이를 자동으로 감지하고 정리하여 메모리를 확보합니다.
주기의 자동 가비지 수집
할당 수가 특정 임계값만큼 할당 취소 수를 초과하면 가비지 수집이 자동으로 실행됩니다. 이 임계값은 gc 모듈을 사용하여 검사할 수 있습니다.
Pythonimport gc print(gc.get_threshold())
산출
(2000 10 10)
설명: 0세대 1과 2세대에 대한 임계값 튜플을 반환합니다. 할당이 임계값 수집을 초과하면 트리거됩니다.
수동 가비지 수집
특히 참조 순환의 경우 가비지 수집기를 수동으로 호출하는 것이 유용한 경우가 있습니다. 예:
Pythonimport gc # Create a cycle def fun(i): x = {} x[i + 1] = x return x # Trigger garbage collection c = gc.collect() print(c) for i in range(10): fun(i) c = gc.collect() print(c)
산출
0 10
설명:
- 확실히 재미있다(i) 사전 참조 자체를 만들어 순환 참조를 만듭니다.
- gc.수집() 가비지 수집을 트리거하고 수집된 개체 수(초기 0)를 저장합니다.
- 범위 안에 있는 나를 위해(10) 전화 재미(i) 10개의 순환 참조를 10번 생성합니다.
- gc.수집() 가비지 수집을 다시 시작하고 수집된 주기 수를 인쇄합니다.
수동 가비지 수집 유형
- 시간 기반 가비지 수집: 가비지 수집기는 고정된 시간 간격으로 트리거됩니다.
- 이벤트 기반 가비지 수집: 가비지 수집기는 사용자가 애플리케이션을 종료하거나 애플리케이션이 유휴 상태가 되는 경우와 같은 특정 이벤트에 대한 응답으로 호출됩니다.
강제 가비지 수집
Python의 가비지 수집기(GC)는 자동으로 실행되어 사용되지 않는 개체를 정리합니다. 강제로 실행하려면 gc 모듈에서 gc.collect()를 사용하세요. 예:
Pythonimport gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect()
설명:
- abc에서 다음에 대한 참조를 삭제합니다. a b 그리고 기음 가비지 수집 대상이 되도록 합니다.
- gc.수집() 참조되지 않은 객체를 정리하여 가비지 수집을 통해 메모리를 확보합니다.
가비지 수집 비활성화
Python에서는 가비지 수집기가 자동으로 실행되어 참조되지 않은 개체를 정리합니다. 실행을 방지하려면 gc 모듈에서 gc.disable()을 사용하여 비활성화할 수 있습니다. 예:
Pythonimport gc gc.disable() gc.enable()
설명:
- gc.비활성화() 자동 가비지 수집을 비활성화합니다.
- gc.활성화() 자동 가비지 수집을 다시 활성화합니다.
Python 가비지 수집기와 상호 작용
Python 가비지 수집기라는 내장 메커니즘은 메모리를 확보하고 메모리 누수를 막기 위해 더 이상 참조되지 않는 개체를 자동으로 제거합니다. Python gc 모듈은 자동으로 실행되는 경우가 많은 가비지 수집기와 상호 작용하는 다양한 방법을 제공합니다.
1. 가비지 수집기 활성화 및 비활성화: 다음을 사용하여 가비지 수집기를 활성화하거나 비활성화할 수 있습니다. gc. 할 수 있게 하다() 그리고 gc. 장애를 입히다() 각각 기능을 수행합니다. 예 :
안녕하세요 세계 자바Python
import gc # Disable gc.disable() # Enable gc.enable()
2. 강제 가비지 수집: 다음을 사용하여 가비지 수집을 수동으로 트리거할 수 있습니다. gc. 모으다() 기능. 이는 자동 가비지 수집이 발생할 때까지 기다리는 대신 즉시 가비지 수집을 강제하려는 경우에 유용할 수 있습니다. 예:
Pythonimport gc gc.collect()
3. 가비지 수집기 설정 검사: 다음을 사용하여 가비지 수집기의 현재 설정을 검사할 수 있습니다. gc.get_threshold() 0세대 1세대와 2세대의 현재 임계값을 나타내는 튜플을 반환하는 함수입니다. 예:
Pythonimport gc t = gc.get_threshold() print(t)
산출
(2000 10 10)
4. 가비지 수집기 임계값 설정: 다음을 사용하여 가비지 수집 임계값을 설정할 수 있습니다. gc.set_threshold() 기능. 이를 통해 가비지 수집 빈도에 영향을 미칠 수 있는 다양한 세대의 임계값을 수동으로 조정할 수 있습니다. 예:
Pythonimport gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t)
산출
(500 5 5)
장점과 단점
Python 가비지 수집의 장점과 단점을 살펴보겠습니다.
장점 | 단점 |
|---|---|
자동 메모리 관리 | 성능 오버헤드가 발생할 수 있음 |
수동 메모리 처리 없음 | 메모리 개념에 대한 이해가 필요합니다. |
세대를 통한 효율적인 정리 | GC 타이밍에 대한 제한된 제어 |
맞춤형 GC 설정 | 버그 또는 메모리 누수 가능성 |