python 메모리 회수 메커니즘

참조 링크http://www.cnblogs.com/vamei/p/3232088.html
1. 대상 및 인용 에 대한 간단 한 이해
python 의 할당 문 에서 예 를 들 어 a=1, 매개 변수 a 은 하나의 인용 이 고 1 은 하나의 대상 이 며 a 이 가리 키 는 대상 1 을 참조 합 니 다.python 의 내장 함수 id() 은 대상 의 메모리 주 소 를 표시 할 수 있 습 니 다. 예 를 들 어:
a = 1
b = a
print(id(a))
print(id(1))
print(id(b))
print(hex(id(1))) #           

실행 결 과 는:
31163080 31163080 31163080 0x1e582c8L
설명: 대상 1 메모리 에 있 는 주 소 는 31163080 이 고 두 개의 인용 ab 이 가리 키 는 대상 의 메모리 주소 도 31163080 이다.
또한 두 인용 이 가리 키 는 대상 이 같은 대상 인지 판단 하려 면 is 으로 판단 할 수 있다. 예 를 들 어:
a = 1
b = 1
print(a is b)
a = 1
b = a
print(a is b)
a = 1
b = 2
print(a is b)

실행 결 과 는:
True True False
숫자 와 문자열 의 대상 을 만 들 때 같은 숫자 나 문자열 이 라면 대상 이 가리 키 는 메모리 주소 가 같 습 니 다.다른 대상 을 만 들 때 대상 이 가리 키 는 메모리 주소 가 다 릅 니 다. 예 를 들 어:
#encoding=utf-8
a = 1.1
b = 1.1
print(id(a))
print(id(b))
a = 'Good morning   '
b = 'Good morning   '
print(id(a))
print(id(b))
a = [1,2,3]
b = [1,2,3]
print(id(a))
print(id(b))
a = (1,2,3)
b = (1,2,3)
print(id(a))
print(id(b))

실행 결 과 는:
32145944 32145944 43350368 43350368 43301960 43302600 32270952 32271744
2. 대상 참조 횟수 보기sys 패키지 중 getrefcount() 함수 로 대상 의 인용 횟수 를 볼 수 있 습 니 다. 예 를 들 어:
from sys import getrefcount
a = [1,2,3]
print(getrefcount(a))
b = [4,5,6]
c = [4,5,6]
print(getrefcount(b))
print(getrefcount(c))
d = [7,8,9]
e = d
print(getrefcount(d))
print(getrefcount(e))

실행 결 과 는:
2 2 2 3 3
설명: 의문점 1. 왜 매개 변수 a 대응 대상 의 인용 횟수 는 2 이지 1 이 아 닙 니까?
이치 에 따 르 면 a = [1,2,3] 할당 문 구 는 한 번 의 대상 만 인용 한 것 으로 대상 [1,2,3] 의 인용 횟수 가 2 인 것 을 나타 내 는 이 유 는 getrefcount() 함 수 를 호출 할 때 매개 변 수 는 임시 인용 을 만 들 었 기 때문이다.
의문점 2. 왜 매개 변수 bc 대응 대상 의 인용 횟수 는 2 이 고 매개 변수 de 대응 대상 의 인용 횟수 는 3 입 니까?
문장 b = [4,5,6]c = [4,5,6] 은 두 개의 서로 다른 대상 을 만 들 었 고 대상 이 가리 키 는 메모리 가 다 르 기 때문에 bc 대응 대상 의 인용 횟수 는 각각 두 번 이다.한편, 문장 d = [7,8,9]e = d 은 하나의 대상 을 만 들 었 고 대상 이 가리 키 는 메모리 가 같 으 며 de 은 같은 대상 에 대응 하기 때문에 대상 의 인용 횟수 는 3 이다.
3. 대상 인용 횟수 감소
예: 1.
from sys import getrefcount
a = [1,2,3]
print(id(a))
a.remove(1)
print(id(a))
print(a)

실행 결 과 는:
43355208 43355208 [2, 3]
설명: 대상 [1,2,3] 에서 요 소 를 삭제 하고 대상 이 가리 키 는 메모리 주 소 는 변 하지 않 습 니 다.
2、
from sys import getrefcount
a = [1,2,3]
b = a
print(getrefcount(b))
del a
print(getrefcount(b))

실행 결 과 는:
3 2
설명: del 으로 어떤 인용 을 삭제 하면 대상 의 인용 횟수 가 줄어든다.
4. python 메모리 의 방출
특정한 대상 의 인용 횟수 가 0 으로 변 하면 대상 이 사용 하 는 메모리 가 회수 되 고 큰 메모 리 를 사용 하 는 변수 에 대해 del 변 수 는 해당 하 는 메모리 공간 을 즉시 방출 하지 못 하 며 수 동 으로 메모 리 를 방출 해 야 합 니 다. 문 구 는 gc.collect() 입 니 다.

좋은 웹페이지 즐겨찾기