해결에 파이썬 메모리 관리 및 가비지 컬렉션 알고리즘

이 문서는 소개하고 기존의 쓰레기 수집 메커니즘, 작업의 메서드, 파이널 문제 및 기타 관련 콘텐츠를 소개 파이썬 메모리 관리 및 가비지 컬렉션 알고리즘 해상도, 특정 참조 값을 가지고, 필요 친구는 다음을 이해할 수있다.
개요

리스트, 튜플 인스턴스 클래스, 사전 기능과 순환 참조 문제가 존재한다. 거기 방법의 예로는 사운드 방식으로 처리 될 것이다. GC 지원의 새로운 유형을 추가하는 것은 매우 쉽습니다. GC 및 일반 파이썬 파이썬 바이너리 호환 지원합니다.

세대 복구 실행 작업 (현재 세 세대). pybench 측정 결과는 4 % 오버 헤드에 관한 것이다. 거의 모든 확장 모듈 (I 새롭고의 cPickle 모듈의 표준 버전을 수정했다)가 제대로 같은 작업을 유지해야한다. 새 모듈의 GC는 디버거가 복구 즉시 사용 및 디버깅 옵션을 설정할 수 있습니다했다.

콜렉터는 플랫폼에서 이식이 가능합니다. 패치의 파이썬 버전은 아무 문제없이 시간의 성배, 유휴 및 스케치 실행하는 모든 테스트 및 수익을 통과했다.

파이썬 2.0 이상 버전 때문에 휴대용 가비지 컬렉션에 포함되는되었다. 가비지 콜렉션은 기본적으로 사용됩니다. 그것의 기쁜 일부를 바랍니다!

왜 우리가 쓰레기 수집이 필요합니까?

파이썬의 현재 버전은 메모리 할당을 관리하는 기준 계수를 사용한다. 각 개체는이 참조 카운트는 가리 얼마나 많은 개체를 나타냅니다 참조 횟수 파이썬이있다. 기준 카운트가 0 인 경우, 오브젝트는 해제된다. 대부분의 프로그램에 대한 참조 카운트가 잘 작동합니다. 그러나, 결함이있는 자연의 참조 카운트는 원형 기준으로 인해 발생한다. 순환 참조의 간단한 예는 오브젝트 자체에 대한 참조이다. 예를 들면 :

>>> l = []
>>> l.append(l)
>>> del l

이는 레퍼런스 카운트의리스트가 이제 1로 만들었다. 그러나 이후 이미 파이썬 내에서 액세스 할 수없는, 다시 사용할 수 없습니다, 그것은 쓰레기로 취급되어야한다. 파이썬의 현재 버전에서는이 목록은 공개되지 않습니다.

원형 참조는 일반적으로 좋은 프로그래밍 방법이 아닙니다, 그것은 거의 항상 피할 수. 하지만 경우에 따라서는 원형 참조를 만들지 않도록하기 어려운, 또는 프로그래머는 순환 참조의 문제도 인식하지 못합니다. 프로그램을 장기 실행 들어, 서버로,이 문제는 특히 걱정입니다. 사람들은 자신의 서버로 인해 메모리가 소진되고 액세스 할 수 없습니다 순환 참조 객체의 해제 할 수 없습니다 싶지 않아요. 큰 프로그램의 경우, 순환 참조 만드는 방법 하드를 찾을 수 있습니다.

"전통"가비지 컬렉션은 무엇입니까?

전통적인 가비지 컬렉션 (예 : 마크로 - 스윕 방법 또는 정지 - 복사 방법)으로 다음과 일반적으로 :

루트 개체 시스템을 찾을 수 있습니다. 루트 개체는 글로벌 (예 : 파이썬과 같은 환경처럼 스택 모듈) 및 객체입니다.
이러한 개체에서 액세스 할 수있는 모든 객체를 검색합니다. 이러한 개체는 "활성"입니다.
다른 모든 객체의 릴리스.
불행하게도,이 방법은 파이썬의 현재 버전에 사용할 수 없습니다. 확장 작업 모듈 때문에, 파이썬은 완전히 객체의 루트 설정을 확인할 수 없습니다. 객체의 루트 세트가 정확하게 확인할 수없는 경우, 우리는 여전히 참조 된 개체의 방출의 위험이있다. 다른 확장 모듈의 사용은, 현재 C의 스택에 휴대용 개체를 찾을 수있는 방법이 없도록 설계 또한, 참조 횟수가 이미 혜택과 끝의 의미에 대한 메모리 참조의 지역성을 기대하고 일부 파이썬 프로그래머를 제공했다. 우리는 또한 사용할 수있는 참조 수를 찾을 수 있지만, 그 가장은 순환 참조의 구성을 해제 할 수 있습니다.

어떻게이 방법을 작동합니까?

개념적으로,이 방법과 기존의 쓰레기 수집 메커니즘 반대. 이 방법을 시도 모든 액세스 개체를 찾을 것이 아니라 액세스 가능한 모든 객체를 이동합니다. 이 방법은 적어도 (우리의 시간과 공간을 낭비하는 관계 없음) 더 이상 가비지 컬렉션하지 않고, 실패하는 경우 때문에 훨씬 안전합니다.

우리는 참조 카운트 가비지 수집기에 여전히 있기 때문에 단지 순환 참조를 찾을 필요가있다. 참조 횟수가 폐기물 다른 종류의 처리됩니다. 먼저, 순환 참조 만 컨테이너 객체를 생성 할 수 있다는 것을 관찰했다. 컨테이너 개체가 참조 된 다른 개체를 포함 할 수있는 개체입니다. 파이썬에서, 목록, 사전, 인스턴스, 클래스와 예는 조상 컨테이너 개체입니다. 정수 및 문자열 컨테이너 아니다. 이 발견으로, 우리는 비 컨테이너 개체가 쓰레기 무시 재활용 할 수 있다는 것을 깨달았다. 정수와 문자열이 비교적 가벼운해야 이것은 유용한 최적화 등이다.

이제 아이디어는 모든 컨테이너 개체를 기록하는 것입니다. 할 수있는 여러 가지 방법이 있습니다, 그러나 가장 좋은 방법은 이중 연결리스트를 사용하는 것입니다, 객체 구조의 연결리스트는 포인터 필드로 구성된다. 신속하게 컬렉션에서 제거 된 개체를 삽입하고 수행 할 수 있습니다되지 않은 추가 메모리 할당이 필요합니다. 컨테이너가 작성되면, 그것은이 컬렉션에 삽입되어 삭제되고, 이것은 컬렉션으로부터 제거된다.

이제 우리는 컨테이너 모든 개체를 얻을 수 있습니다, 우리는 어떻게 순환 참조를 찾을 수 있습니까? 처음에 우리는 두 개의 포인터 외부 컨테이너 개체에 다른 필드를 추가합니다. 우리는이 분야의 gc_refs을 지명했다. 우리는 다음 단계에서 순환 참조를 찾을 수 있습니다 :

각 컨테이너 객체 제공 gc_refs 오브젝트의 참조 카운트 값.
다른 용기에 마이너스 값이 이들에 gc_refs를 찾는 개체 참조 각 컨테이너 객체.
모든 gc_refs 컨테이너 객체는 컨테이너 외부 개체의 컬렉션에 의해 참조보다 큰 개체입니다. 우리가 다른 모음으로 이러한 개체를 넣어, 그래서 우리는 이러한 개체를 해제 할 수 없습니다.
개체가 참조 된 개체를 해제 할 수 없습니다 제거됩니다. 우리는 그들을 넣고 오브젝트에 액세스 현재 컬렉션에서 제거됩니다 제공합니다.
나머지 오브젝트의 집전 만 컬렉션 오브젝트에서 참조하는 (즉, 그들이 쓰레기 인 파이썬으로 수행 될 수 없다). 우리는 지금 이러한 개체를 해제 할 수 있습니다.
종료 자 문제

문제가 우리의 웅대 한 계획은, 문제는 파이널 라이저를 사용하는 것입니다. 파이썬에서 예 종료 자 __del__의 방법입니다. 참조 카운트를 사용하는 경우, 파이널 잘 작동합니다. 객체의 참조 카운트가 0으로 떨어질 때 객체가 호출되기 전에는, 파이널은 출시 때. 프로그래머의 경우, 이것은 간단하고 이해하기 쉽다.

가비지 콜렉션이 호출 할 때 종결 자 순환 참조의 문제에 직면 특히 성가신 문제가되고있다. 순환 참조에서 두 개체가 종료자가있는 경우, 어떻게 할까? 어느 첫 번째 호출? 두 번째 파이널 라이저는 그것을 얻을 수 있기 때문에 첫 번째 파이널 라이저를 호출 한 후, 객체는 해제 할 수 없습니다.

이 문제에 대한 좋은 솔루션이 없기 때문에, 참조 된 객체는 파이널주기가 해제되지 않을 수 있습니다. 대신, 이러한 개체는 재활용 할 수없는 쓰레기의 글로벌 목록에 추가됩니다. 프로그램은 항상이 문제를 방지하기 위해 작성된 재해야한다. 최후의 수단으로, 프로그램은이 목록을 모두 읽을 수있는 의미있는 방법으로 현재의 응용 프로그램에 대한 루프에서 이러한 참조를 해제.

어떤 가격에?

어떤 사람들은 말처럼, 태양 아래에는 공짜 점심이 없다. 그러나 가비지 컬렉션의 형태는 상대적으로 저렴하다. 각 추가 컨테이너 개체 당 가장 큰 비용 중 하나는 메모리 공간의 세 단어가 필요합니다. 유지 보수 오버 헤드 컨테이너 컬렉션이 있습니다. 가비지 컬렉터의 현재 버전은, 비용은 아마 퍼센트 하락 네 pybench이 속도를 기반으로합니다.

가비지 콜렉터 전류 기록 정보 객체의 3 세대입니다. 가비지 컬렉션에 걸리는 시간의 매개 변수를 조정함으로써 당신은 얼마나 작은 얼마나 작은 생각할 수 있습니다. 일부 애플리케이션의 경우, 중요 할 수있는 자동 쓰레기 수집 및 런타임 명시 적으로 호출 끕니다. 그러나 기본 가비지 컬렉션 매개 변수 pybench, 잘 보이지 않는 소비 쓰레기 수거 시간을 실행합니다. 분명히, 컨테이너 개체를 분배 많은 응용 프로그램은 더 쓰레기 수거 시간이 발생할 수 있습니다.

현재 패치는 가비지 컬렉터를 활성화하기 위해 새 구성 키가 추가됩니다. 가비지 컬렉터는 표준 파이썬 파이썬있다 바이너리 호환입니다. 이 옵션이 해제 된 경우 파이썬 인터프리터의 작업은 영향 없을 것입니다.

어떻게 그것을 사용할 수 있습니까?

그냥 파이썬의 현재 버전을 다운로드합니다. 가비지 컬렉터는 향후 버전 2.0에 포함되어 있으며, 기본은 기본적으로 활성화되어 있습니다. 파이썬 1.5.2 버전을 사용하는 경우, 패치 작업 아마도 이전 버전이있다. 당신은 Windows 플랫폼을 사용하는 경우, 당신은 python15.dll을 다운로드 할 수 있습니다하는 대체합니다.

뵘 - 멀스 보수적 가비지 콜렉션

이 패치는 뵘 - 멀스 컬렉터 보수적 쓰레기를 사용하여 파이썬 1.5.2 일부 수정을 추가합니다. 하지만 당신은이 패치를 공격해야합니다. 또 참조 카운트를 사용한다. 가비지 수집기은 레퍼런스 카운트 메모리 (즉, 순환 참조) 해제되지 발표한다. 이것은 최선의 성능을해야한다. 당신이 필요합니다 :

$ cd Python-1.5.2
$ patch -p1 < ../gc-malloc-cleanup.diff
$ patch -p1 < ../gc-boehm.diff
$ autoconf
$ ./configure --with-gc

-lgc 링크 옵션을 사용할 수 있습니다 만들고,이 패치 libgc.a를 설치하는 가정 (/ usr / 지방 / lib 디렉토리가 있어야한다). 당신은 다운로드를 컴파일하기 전에이 라이브러리를 설치하지 마십시오.

현재,이 패치는 리눅스에서 테스트되었습니다. 아마도 다른 유닉스 시스템에서 작동합니다. 내 리눅스 시스템에서, 파이썬의 GC 버전은 모든 회귀 테스트를 전달합니다.

나는 모두가 매우 넓은 파이썬 학습 자원 수집을 권장하기 위해, 당신에 기록 입력을 클릭하여 공유 경험, 연구 노트에 학습 전 수석, 프로그래머가,이 사업 경험의 기회이며, 모두주의 깊게 파이썬 제로 구성에 작은 세부 사항을 학습 실제 프로젝트 데이터, 최신 기술에 당신에게 매일 파이썬, 전망의 근거는 메시지 떠날 필요
요약

그 해결 파이썬 메모리 관리 및 가비지 컬렉션 알고리즘에 대한이 문서에 대한 모든입니다

게시 43 개 원래 기사 · 원 찬양 13 ·은 50000 +를 볼

추천

출처blog.csdn.net/haoxun11/article/details/105057229