고급 파이썬 : 폐기물 분리 및 복구 프로그램 산업

  가비지 콜렉션은 내장 메모리 공간을 사용하지 않습니다 자동 릴리스에 대한 메커니즘 파이썬이다;

메모리가 누수 무엇입니까?

  • 메모리 누수, 메모리 정보 보안 문제, 프로그램의 악의적 인 사용이되었다는 말을하지,하지만 좋은 디자인 과정 자체에 프로그램을 일으키는 것은 메모리가 더 이상 사용하지 않을 확보하지 못합니다.
  • 메모리 누수가 메모리가 물리적으로 사라지지 않는다는 것을 의미하지만, 메모리 할당 일정 기간 후 코드가 있기 때문에 설계 오류의 메모리의 낭비의 결과로,이 메모리의 컨트롤을 잃은 것을 의미한다.

참조 카운트

  파이썬 객체의 모든 것. 이 객체의 참조 횟수 (포인터의 수)가 0 일 때, 이것을 설명되지 않습니다 개체, 그것은 자연적으로 복구 할 수 필요가 낭비 될 것이다.

  예 :

#이 프로그램 파이썬의 현재의 메모리 크기를 표시합니다 
DEF의 : show_memory_info (힌트) 
    PID = os.getpid () 
    P = psutil.Process (PID) 
    
    정보를 원하시면 = p.memory_full_info () 
    메모리 = info.uss / 1024 / 1024
     인쇄 ( ' 메모리 사용} {{} MB ' .format (힌트, 메모리))
데프 FUNC () 
    show_memory_info ( ' 초기 ' ) = I 에 대한 I  범위 (10000000 )] 
    show_memory_info ( ' 생성 된 후 ' ) 

FUNC () 
show_memory_info ( ' 마무리 ' ) 

# #########输出##########
# 초기 메모리 사용 : 6.62890625 MB를
생성 된 메모리 후 #을 사용 : 199.33203125 MB를
# 완료 메모리 사용 : 7.6640625 MB를

  초기화 프로그램 메모리 6메가바이트 차지 후 따라서 함수 반환 기준 카운트가 0이 A가 회수 될 때, 상승 2백메가바이트 메모리를 차지 회수되지 않았 복구 메모리 때문에, 목록 작성 7메가바이트합니다.

  전역 변수, 함수가 반환에 투입하는 경우, 참조 횟수가 0보다 여전히 더 큰, 다음 개체가 가비지 수집되지 않습니다, 여전히 많은 메모리가 점유

데프 FUNC () 
    show_memory_info ( ' 초기 ' )
     글로벌 = I 에 대한 I  범위 (10000000 )] 
    show_memory_info ( ' 생성 된 후 ' ) 
FUNC () 
show_memory_info ( ' 마무리 ' ) #에 ####### ##输出########## # 초기 메모리 사용 : 6.67578125 MB의 
# 199.30859375 MB의 : 중고 만든 메모리 후 
# 사용 완료 메모리 : 199.30859375 MB




  또는 메인 프로그램에서받을 수있는 목록을 반환, 참조는 여전히 존재, 가비지 콜렉션이 트리거되지 않습니다, 여전히 많은 메모리 점유

데프 FUNC () 
    show_memory_info ( ' 초기 ' ) = I 에 대한 I  범위 (10000000 )] 
    show_memory_info ( ' 후 생성 " )
     반환 = FUNC () 
show_memory_info를 ( ' 마무리 ' ) #의 ##### ####输出########## # 초기 메모리 사용 : 6.6484375 MB의 
# 199.2890625 MB의 : 중고 만든 메모리 후 
# 사용 완료 메모리 : 199.2890625 MB




  내부 파이썬 참조 카운팅 메커니즘 봐

오기 SYS
 = [] 

# getrefcount의 회에서 참조하는 하나, 
인쇄 (sys.getrefcount (A)) 

DEF FUNC (A) :
     # 네 참조하는 파이썬 함수 호출 스택 함수 파라미터 및 getrefcount 
    인쇄 (sys.getrefcount (A)) 

FUNC (A) 

# getrefcount에서 두 개의 참조하는 하나, 존재하지 않는 함수 FUNC를 호출 
인쇄 (sys.getrefcount (A)) 

#의 ####### ########## 출력 ##
 
2 
. 4 
(2)

  sys.getrefcount () 함수를 사용하면 변수 참조의 수를 볼 수 있습니다. 코드 자체는 잘 이해되어야하지만, 잊지 자체가 수를 한 번 소개합니다 getrefcount하지 않습니다. 주목해야 할 또 다른 점은 함수 호출이 발생하면, 추가로 두 개의 참조, 함수 스택에서 하나, 다른 함수 매개 변수를 생성 할 것입니다.

  또 다른 예 :

오기 SYS 

A는 = [] 

인쇄 (sys.getrefcount (A)) # 2 회 

B = 인쇄 (sys.getrefcount (A)) # 
C = B에서 
D = B 
E = C 
F = E 
G = D의 전단 (SYS .getrefcount (A)) # 여덟 # ######### ########## 출력 
2 
. 3 
. 8







  A, B, C, D, E, F, G, 변수는 모두 같은 객체를 참조하지만 sys.getrefcount () 함수는 통계 포인터되지 않지만, 오브젝트를 참조하는 마지막을 횟수를 세는 여덟 개의 참조가있을 것이다.

  수동으로 메모리를 해제, 내가 그것을 어떻게해야합니까? 상기 방법은 동일하게 간단하다. 그냥 델은 첫 번째 호출은 객체를 삭제 한 다음 (), 수동 가비지 수집을 시작할 수 있습니다 GC.Collect를 호출하도록 강요.

오기 GC
 오기 OS
 임포트 psutil
 # 프로그램 파이썬 현재 메모리 용량 표시 
DEF의 show_memory_info (힌트) 
    PID = os.getpid () 
    P = psutil.Process (PID) 
    
    정보 = p.memory_full_info () 
    메모리 = info.uss / 1,024 . / 1024
     인쇄 ( ' 사용 {} 메모리 : {} MB ' .format (힌트, 메모리)) 

show_memory_info ( ' 초기 ' )
 = [I 위한 I  범위 (10000000 )] 

show_memory_info (' 생성 된 후 ' ) 


하는 GC.Collect () 
show_memory_info ( ' 마무리 ' )
 인쇄 (가) 
초기 메모리 사용 : 6.54296875 MB 
생성 된 메모리 후 사용 : 199.17578125 MB가 
사용하는 메모리 마무리 : 7.26171875 MB 
역 추적 (가장 최근 통화 최종) : 
  파일 " Coroutine.py " , 라인 24 에서 <모듈>
     인쇄 (a)에 
나가서 설명하자면 NameError : 이름은 ' ' 입니다 하지 정의

  

순환 참조

   관측 코드 :

데프 FUNC () 
    show_memory_info ( ' 초기 ' ) = I 에 대한 I  범위 (10000000 )] 
    B = [I 위한 I  범위 (10000000 )] 
    show_memory_info ( " A, B 만든 후 ' ) 
    a.append (b ) 
    b.append의 (a) 

FUNC () 
show_memory_info ( ' 완료 ' ) 

# #########输出##########

  초기 메모리 사용 : 6.625 MB를
  후, 생성 된 메모리 b를 사용 : 392.08984375 MB
  완료된 메모리를 사용 : 392.08984375 MB를

  여기서, A와 B는 서로를 참조하고, 로컬 변수, 함수 호출 FUNC하는 후 프로그램이 더 이상 존재하지 모두에서 감지 포인터 나. 그러나, 분명히, 여전히 메모리 공간이 있습니다! 이유는 무엇입니까? 참조 서로 때문에, 자신의 참조 번호를 선도 제로는 아니다.

  이러한 상황에 대처 명시 적으로 호출 할 수 있습니다 가비지 수집을 시작하는 () GC.Collect를 호출.

  파이썬은 순환 참조에 대한 자동 가비지 컬렉션을 사용하려면, (마크 스윕) 및 세대 수집 알고리즘 (세대)를 취소 마커를 사용합니다.

메모리 누수 디버깅

  objgraph 패키지 관계에 매우 편리한 시각적 참조.

  설치 :

설치 핍은 GraphVIZ는 
xdot 설치 PIP 
objgraph를 설치 PIP

  창, 당신은 위의 라이브러리뿐만 아니라 공식 웹 사이트에 추가로 설치할 https://graphviz.gitlab.io/_pages/Download/Download_windows.html \ 프로그램 파일 (86) : 다운로드 한 후 C의 환경 변수 경로 증가 설정 \ Graphviz2.38 \ bin으로 CMD를의 -version 검증에 점을 입력합니다.

  메모리 누수가 발생할 가능성이 있음을 나타내는 두 개의 목록이 서로 참조가,이 코드는 생성되고 아래의 호출 그래프를 참조하여, 당신은 매우 직관적으로 찾을 수 있습니다.

수입 objgraph의
 = [1, 2, 3 ] 
B = 4, 5, 6 ] 

a.append (b) 
b.append (a) 

objgraph.show_refs ([A])

     

  참고 : 창에 입력하라는 메시지가 나타날 수 있습니다 :

그래프는 C로 작성 : \ 사용자가 공용 \ 문서 \ Wondershare \ CreatorTemp \ objgraph-wwcqiie_.dot (8 개 \ 노드) 
이미지 렌더러 (점) 하지 발견 하지 아무것도하고 다른 사람을

  도트 파일이있는 그런 다음 긴 경로를 열고 CMD 실행할

 점. \ objgraph-yclwfpzr.dot -Tpng -o의 image.png

  당신은 파일을 생성 할 수 있습니다.

  또 다른 매우 유용한 기능이 show_backrefs이다 (). 다음은 통화 show_backrefs () 생성 된 사진입니다.

  

 참고

  긱 시간 "파이썬 핵심 기술과 실제"열

추천

출처www.cnblogs.com/xiaoguanqiu/p/11197604.html