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

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

高洛峰
高洛峰원래의
2016-10-17 16:39:031180검색

참조 카운팅

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


파이썬의 보조 가비지 수집 기술인 마크 지우기 알고리즘은 주로 list, dict, tuple, Instance 등과 같은 일부 컨테이너 개체를 처리합니다. 숫자 객체 순환 참조 문제를 일으키는 것은 불가능합니다. Python은 이중 연결 목록을 사용하여 이러한 컨테이너 개체를 구성합니다.

세대 재활용

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


세대 재활용은 해당 컨테이너 객체를 처리하는 Python의 보조 가비지 수집 기술 역할도 합니다.


관련 단어 검색: 메커니즘 쓰레기 수거


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