>  기사  >  백엔드 개발  >  Python 가비지 수집 메커니즘에 대한 자세한 설명

Python 가비지 수집 메커니즘에 대한 자세한 설명

高洛峰
高洛峰원래의
2016-11-23 13:26:221279검색

참조 카운팅

Python의 기본 가비지 수집 메커니즘은 "참조 카운팅"이며, 각 객체는 ob_ref ​​​​필드를 유지 관리합니다. 장점은 메커니즘이 간단하다는 것입니다. 새로운 참조가 객체를 가리키면 참조 카운트는 1씩 증가합니다. 객체의 참조가 파괴되면 1씩 감소합니다. 일단 객체의 참조 카운트는 0이 됩니다. , 객체가 즉시 재활용되고 점유된 메모리가 해제됩니다. 단점은 참조 카운트를 유지하기 위해 추가 공간이 필요하다는 점이지만, 주요 문제는 "순환 참조"를 해결할 수 없다는 것입니다.


순환참조란 무엇인가요? A와 B는 서로를 참조하며 A나 B에 대한 외부 참조가 없습니다. 참조 횟수는 둘 다 1이지만 분명히 재활용되어야 합니다. 예:
a = { } # a의 참조는 1입니다. 🎜 > b = { } # b의 참조는 1입니다
a['b'] = b # b의 참조는 1만큼 증가하고 b의 참조는 2입니다
b['a'] = a # a의 기준은 1 증가, a의 기준은 2
del a # a의 기준은 -1, a의 기준은 1
del b # b의 기준은 -1, b의 참조는 1

이 예에서 del 문은 a와 b의 참조 횟수를 줄이고 참조에 사용된 변수 이름을 삭제합니다. 그러나 두 개체에는 각각 다른 개체에 대한 참조가 포함되어 있습니다. , 마지막 두 개체는 이름으로 액세스할 수 없지만 참조 횟수는 0으로 줄어들지 않습니다. 따라서 이 개체는 삭제되지 않으며 항상 메모리에 상주하므로 메모리 누수가 발생합니다. 순환 참조 문제를 해결하기 위해 Python은 마크 스윕과 세대별 수집이라는 두 가지 GC 메커니즘을 도입했습니다.
Mark Sweep

Mark-Sweep은 추적 재활용 기술을 기반으로 한 가비지 수집 알고리즘입니다. 객체는 참조(포인터)를 통해 연결되어 유향 그래프를 형성하며 객체는 이 유향 그래프의 노드를 구성하고 참조를 구성합니다. 관계는 이 유향 그래프의 가장자리를 구성합니다. 루트 개체부터 시작하여 개체는 방향이 있는 가장자리를 따라 이동합니다. 도달 가능한 개체는 유용한 개체로 표시되고, 도달할 수 없는 개체는 지워지는 개체입니다. 소위 루트 개체는 함수 스택의 일부 전역 참조 개체 및 참조입니다. 이러한 참조에서 참조하는 개체는 삭제할 수 없습니다.


마크 지우기 알고리즘은 Python의 보조 가비지 수집 기술로 문자열에 대한 순환 참조가 불가능하기 때문에 주로 list, dict, tuple, Instance 등과 같은 일부 컨테이너 개체를 처리합니다. 그리고 숫자 개체에 대한 질문입니다. Python은 이중 연결 목록을 사용하여 이러한 컨테이너 개체를 구성합니다.
세대 재활용

세대 재활용은 공간을 시간으로 교환하는 작업 방식으로, Python은 개체의 생존 시간을 기준으로 메모리를 여러 컬렉션으로 나눕니다. 3개의 "세대", 즉 젊은 세대(0세대), 중간 세대(1세대), 구세대(2세대)로 나누어지며, 이들은 3개의 연결 리스트에 해당하며, 가비지 수집 빈도는 객체의 빈도와 관련이 있습니다. 생존 시간이 증가할수록 감소합니다. 새로 생성된 개체는 젊은 세대에 할당됩니다. 전체 젊은 세대 연결 목록 수가 상한선에 도달하면 Python 가비지 수집 메커니즘이 트리거되어 재활용 가능한 개체와 재활용되지 않는 개체를 재활용합니다. 노년기의 개체는 전체 시스템의 수명주기 내에서도 가장 오래 살아남은 개체입니다. 동시에 세대별 재활용은 표시 및 청소 기술을 기반으로 합니다.


세대 재활용은 이러한 컨테이너 개체를 처리하는 Python의 보조 가비지 수집 기술로도 사용됩니다

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.