Python 메모리 유출 및 메모리 유출 솔루션

1. 메모리 유출
Java 프로그램처럼 Python 자체도 쓰레기 수거 기능이 있지만 메모리 유출 문제도 발생한다.
python으로 이루어진 장기적으로 실행되는 백엔드 서비스 프로세스에 있어 메모리가 지속적으로 증가하면'메모리 유출'이 발생할 가능성이 높다.
1. 메모리 유출의 원인
python과 같은 쓰레기 회수 지원 언어에 어떻게 메모리 유출이 있을 수 있습니까?요약하면 다음과 같은 세 가지 이유가 있습니다.
  • C 언어로 개발된 기본 모듈에서 메모리 유출이 발생했습니다..
  • 코드는 전역적인list,dict 또는 다른 용기에 사용되며, 끊임없이 이 용기에 대상을 삽입하고, 사용한 후에 삭제 회수하는 것을 잊어버렸다
  • 코드에 참조 루프가 있고 참조되는 객체는 ___를 정의합니다.del__방법은 메모리 유출이 발생할 수 있다.
  • 순환 참조 객체가 __ 정의된 이유del__방법 후에collect가 효과가 없을까요?
    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는 메모리 문제를 진단하는 도구입니다.
  • 1. 서비스 프로그램의 순환 논리에서 진단점을 선택한다
  • 2. 진단점에 다음과 같은 진단 문장을 삽입한다
  • 
    import gc
    import objgraph
    
    
    ###   
    gc.collect() 
    
    ###   50   
    objgraph.show_most_common_types(limit=50) 
    4. 통계 정보를 검사하고 이상 대상을 찾습니다
    진단 문구가 들어간 서비스 프로그램을 실행하고 화면에 출력된 통계 정보를 로그로 다시 지정합니다.일정 시간 운행한 후에 로그를 분석하여 어떤 대상이 끊임없이 증가하고 있는지 볼 수 있다.
    예:
    하나의 다중 스레드 프로그램, 여러 개의 스레드는 생산자로서, 한 개의 스레드는 소비자로서, 하나의tuple 대상을 비동기 대열에 보내서 통신한다.
    소비자의 처리 속도가 생산자의 속도를 따라가지 못하고 동기화되지 않아 비동기 대열의 대상이 갈수록 많아지고 있다.
    2. 메모리 넘침
    1. 메모리 오버플로우 원인
  • 메모리에 불러오는 데이터의 양이 너무 방대하다. 예를 들어 데이터베이스에서 한 번에 너무 많은 데이터를 꺼내는 것과 같다
  • 컬렉션 클래스에는 객체에 대한 참조가 있으며 사용 후 비워지지 않아 JVM을 회수할 수 없도록 쌓입니다
  • 코드에 사순환이나 순환이 지나치게 중복되는 대상 실체가 존재한다
  • 타사 소프트웨어의 BUG를 사용합니다
  • 시작 파라미터의 메모리 값이 너무 작게 설정되었습니다
  • 2. 메모리 오버플로우 솔루션
    첫 번째 단계에서 JVM 시작 매개 변수를 수정하고 메모리를 직접 추가합니다(-Xms, -Xmx 매개 변수는 반드시 추가하는 것을 잊지 마세요).
    두 번째 단계는 오류 로그를 확인하고'OutOfMemory'오류 전에 다른 이상이나 오류가 있는지 확인합니다.
    세 번째 단계, 코드를 조사하고 분석하여 메모리가 넘칠 수 있는 위치를 찾아낸다
    다음 사항을 중점적으로 검토합니다.
  • 데이터베이스 조회에서 모든 데이터를 얻은 조회가 있는지 확인합니다.일반적으로 한 번에 10만 개를 메모리에 기록하면 메모리가 넘칠 수 있다.이 문제는 비교적 은밀하다. 오프라인 전에 데이터베이스에 데이터가 비교적 적고 문제가 생기기 어렵다. 오프라인 후에 데이터베이스에 데이터가 많아지면 한 번의 조회로 메모리가 넘칠 수 있다.따라서 데이터베이스 조회는 가능한 한 페이지를 나누는 방식으로 조회한다
  • 코드에 사순환 또는 귀속 호출이 있는지 확인..
  • 새로운 개체 엔티티가 반복적으로 생성되는지 확인..
  • List, MAP 등 컬렉션 객체의 사용 후 제거되지 않은 문제가 있는지 확인합니다.List, MAP 등의 컬렉션 객체는 GC에서 회수할 수 없도록 항상 객체에 대한 참조가 저장됩니다
  • 4단계, 메모리 보기 도구를 사용하여 메모리 사용 상황을 동적으로 보기
    3. 메모리 유출과 메모리 유출의 차이
    메모리 오버플로우는 JVM이 메모리 공간을 요청할 때 사용할 수 있는 메모리가 충분하지 않으면 OOM 즉 메모리 오버플로우를 내보냅니다.
    메모리 유출은 JVM에 메모리 공간을 요청했는데 사용한 후에 방출되지 않았습니다. 방출되지 않았기 때문에 이 메모리 영역의 다른 종류가 불러올 때 신청할 수 없습니다.
    이 동시에 현재 클래스는 이 메모리 공간의 메모리 주소가 없어도 사용할 수 없습니다. 메모리를 잃어버린 셈입니다. 이것이 바로 메모리 유출입니다.
    주의해야 할 것은 메모리가 유출되면 결국 메모리가 넘칠 수 있다는 것이다. 이해하기 쉽다. 메모리를 많이 잃어버렸으니 당연히 메모리가 부족하다.
    이상은Python 메모리 유출과 메모리 유출에 대한 해결 방안의 상세한 내용입니다. Python 메모리 유출과 메모리 유출에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기