Python 메모리 유출 및 메모리 유출 솔루션
Java 프로그램처럼 Python 자체도 쓰레기 수거 기능이 있지만 메모리 유출 문제도 발생한다.
python으로 이루어진 장기적으로 실행되는 백엔드 서비스 프로세스에 있어 메모리가 지속적으로 증가하면'메모리 유출'이 발생할 가능성이 높다.
1. 메모리 유출의 원인
python과 같은 쓰레기 회수 지원 언어에 어떻게 메모리 유출이 있을 수 있습니까?요약하면 다음과 같은 세 가지 이유가 있습니다.
gc모듈에서 가장 자주 사용하는 방법은 gc입니다.collect () 방법,collect 방법으로 순환 인용 대상을 쓰레기 회수합니다.
만약 우리가 클래스에서 __를 다시 불러왔다면del__메서드.__del__방법은del문장으로 대상을 삭제할 때 메모리 공간을 방출하는 것을 제외하고는 동작을 정의합니다.
일반적으로del문장을 사용할 때 해석기는 먼저 대상을 삭제할 인용 계수를 보고 0이면 메모리를 방출하고del방법을 실행합니다.
여기서 우선del문장이 나타날 때 자체 인용 계수는 0(순환 인용이 존재하기 때문에)이 아니기 때문에 해석기가 메모리를 방출하지 않습니다.
게다가collect 방법을 실행할 때 순환 인용이 발생하는 무효 인용 계수를 삭제하여del의 목적을 달성해야 합니다. 이 두 순환 인용 대상에 대해
python은 그들의del 방법을 호출할 때 상대방의 대상을 사용해야 할지 판단할 수 없습니다. 예를 들어 b.del () 을 진행할 때 b._를 사용할 수 있습니다.a가 바로 a입니다. 만약에 그 전에 a가 풀려났다면 철저하게 GG가 됩니다.
이러한 상황을 피하기 위해,collect 방법은 기본적으로del 방법의 순환 인용 대상을 다시 불러오지 않고, 두 사람의 상태도 unreachable에서 uncollectable로 바뀝니다.uncollectable이기 때문에 자연스럽게collect에 처리되지 않기 때문에garbage 목록에 들어갔습니다.
2. 메모리 유출의 진단 사고방식
어떤 방식의 메모리 유출이든 최종적으로 나타나는 형식은 일부python 대상이 끊임없이 증가하는 것이다.따라서 우선 이런 이상한 대상을 찾아야 한다.
3. 진단 단계
사용되는 도구: gc 모듈과objgraph 모듈
gc모듈은 Python의 쓰레기 수집기 모듈로 gc는 표기 제거 알고리즘을 사용하여 쓰레기를 회수한다
objgraph는 메모리 문제를 진단하는 도구입니다.
import gc
import objgraph
###
gc.collect()
### 50
objgraph.show_most_common_types(limit=50)
4. 통계 정보를 검사하고 이상 대상을 찾습니다진단 문구가 들어간 서비스 프로그램을 실행하고 화면에 출력된 통계 정보를 로그로 다시 지정합니다.일정 시간 운행한 후에 로그를 분석하여 어떤 대상이 끊임없이 증가하고 있는지 볼 수 있다.
예:
하나의 다중 스레드 프로그램, 여러 개의 스레드는 생산자로서, 한 개의 스레드는 소비자로서, 하나의tuple 대상을 비동기 대열에 보내서 통신한다.
소비자의 처리 속도가 생산자의 속도를 따라가지 못하고 동기화되지 않아 비동기 대열의 대상이 갈수록 많아지고 있다.
2. 메모리 넘침
1. 메모리 오버플로우 원인
첫 번째 단계에서 JVM 시작 매개 변수를 수정하고 메모리를 직접 추가합니다(-Xms, -Xmx 매개 변수는 반드시 추가하는 것을 잊지 마세요).
두 번째 단계는 오류 로그를 확인하고'OutOfMemory'오류 전에 다른 이상이나 오류가 있는지 확인합니다.
세 번째 단계, 코드를 조사하고 분석하여 메모리가 넘칠 수 있는 위치를 찾아낸다
다음 사항을 중점적으로 검토합니다.
3. 메모리 유출과 메모리 유출의 차이
메모리 오버플로우는 JVM이 메모리 공간을 요청할 때 사용할 수 있는 메모리가 충분하지 않으면 OOM 즉 메모리 오버플로우를 내보냅니다.
메모리 유출은 JVM에 메모리 공간을 요청했는데 사용한 후에 방출되지 않았습니다. 방출되지 않았기 때문에 이 메모리 영역의 다른 종류가 불러올 때 신청할 수 없습니다.
이 동시에 현재 클래스는 이 메모리 공간의 메모리 주소가 없어도 사용할 수 없습니다. 메모리를 잃어버린 셈입니다. 이것이 바로 메모리 유출입니다.
주의해야 할 것은 메모리가 유출되면 결국 메모리가 넘칠 수 있다는 것이다. 이해하기 쉽다. 메모리를 많이 잃어버렸으니 당연히 메모리가 부족하다.
이상은Python 메모리 유출과 메모리 유출에 대한 해결 방안의 상세한 내용입니다. Python 메모리 유출과 메모리 유출에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.