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

Python 가비지 수집 메커니즘에 대한 자세한 소개

高洛峰
高洛峰원래의
2017-03-19 15:19:041486검색

참조Count

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, 인스턴스 등과 같은 일부 컨테이너 객체를 다룹니다. 문자열 , 숫자 개체가 순환 참조 문제를 일으키는 것은 불가능합니다. Python은 이중 연결 목록을 사용하여 이러한 컨테이너 개체를 구성합니다.

세대 재활용

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

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

위 내용은 Python 가비지 수집 메커니즘에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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