[JVM] 메모리 오버플로 및 메모리 누수

메모리 누수(Memory Leak) : 메모리 누수는 프로그램이 메모리를 신청한 후 할당된 메모리 공간을 해제할 수 없는 것을 의미하며, 메모리 누수는 큰 영향을 미치지 않는 것처럼 보이지만, 메모리 누수가 누적되면 결과적으로 메모리 오버플로가 발생합니다.

메모리 오버플로(Memory Overflow out of memory) : 프로그램이 메모리를 신청할 때 신청자가 사용할 수 있는 메모리가 부족합니다.

메모리 누수 분류(발생 방식에 따라 분류)

  1. 빈번한 메모리 누수 . 메모리 누수가 있는 코드는 여러 번 실행되므로 실행될 때마다 메모리 누수가 발생합니다.
  2. 산발적인 메모리 누수 . 메모리 누수를 일으키는 코드는 특정 상황이나 작업에서만 발생합니다. 자주 발생하는 것과 산발적으로 발생하는 것은 상대적입니다. 특정 상황에서는 가끔씩 발생하는 일이 일반화될 수 있습니다. 따라서 테스트 환경과 테스트 방법은 메모리 누수를 감지하는 데 중요합니다.
  3. 일회성 메모리 누수 . 메모리 누수를 일으키는 코드는 한 번만 실행됩니다. 또는 알고리즘 결함으로 인해 항상 단 하나의 메모리 블록만 누수됩니다. 예를 들어 클래스의 생성자에서 메모리가 할당되었지만 생성자에서 메모리가 해제되지 않은 경우 메모리 누수는 한 번만 발생합니다.
  4. 암시적 메모리 누수 . 프로그램은 실행되는 동안 지속적으로 메모리를 할당하지만, 종료될 때까지 메모리를 해제하지 않습니다. 엄밀히 말하면 프로그램이 결국 요청된 모든 메모리를 해제하기 때문에 여기에는 메모리 누수가 없습니다. 그러나 며칠, 몇 주, 심지어 몇 달 동안 실행해야 하는 서버 프로그램의 경우 메모리를 제때 해제하지 못하면 결국 시스템 메모리가 모두 고갈될 수도 있습니다. 따라서 이러한 유형의 메모리 누수를 암시적 메모리 누수라고 부릅니다.

메모리 오버플로 원인과 해결 방법

메모리 오버플로의 원인

        1. 데이터베이스에서 한 번에 너무 많은 데이터를 가져오는 등 메모리에 로드된 데이터의 양이 너무 많습니다.

        2. 컬렉션 클래스에 객체에 대한 참조가 있는데, 사용 후에도 지워지지 않아 JVM이 재활용할 수 없습니다.

        3. 코드에 무한 루프가 있거나 루프가 너무 많은 중복 개체 엔터티를 생성합니다.

        4. 사용된 타사 소프트웨어의 버그

        5. 시동 매개변수 메모리 값이 너무 작게 설정되었습니다.

메모리 오버플로 솔루션

        첫 번째 단계 는 JVM 시작 매개변수를 수정하고 메모리를 직접 늘리는 것입니다. (-Xms 및 -Xmx 매개변수를 추가하는 것을 잊지 마세요.)

        두 번째 단계 는 오류 로그를 확인하여 "OutOfMemory" 오류 이전에 다른 예외나 오류가 있는지 확인하는 것입니다.

        세 번째 단계 는 코드를 살펴보고 분석하여 메모리 오버플로가 발생할 수 있는 위치를 찾는 것입니다.

        다음 사항에 중점을 둡니다.

        1. 데이터베이스 쿼리에 모든 데이터를 한번에 가져오는 쿼리가 있는지 확인한다. 일반적으로, 한 번에 십만 개의 레코드를 메모리로 가져오면 메모리 오버플로가 발생할 수 있습니다. 이 문제는 상대적으로 숨겨져 있는데, 온라인으로 가기 전에는 데이터베이스에 데이터가 적어서 문제가 발생할 가능성이 적었지만, 온라인으로 된 후에는 데이터베이스에 데이터가 많아 단일 쿼리로 인해 메모리 오버플로가 발생할 수 있습니다. 따라서 특히 대규모 시스템의 경우 데이터베이스 쿼리에 페이징을 사용해 보십시오.

        2. 코드에 무한 루프나 재귀 호출이 있는지 확인하세요.

        3. 새로운 객체 엔터티를 반복적으로 생성하는 대규모 루프가 있는지 확인합니다.

        4. 사용 후 List, Map 등 컬렉션 객체가 지워지지 않는지 확인하세요. List 및 Map과 같은 컬렉션 개체에는 항상 개체에 대한 참조가 있으므로 이러한 개체는 GC에서 재활용할 수 없습니다.

        4단계 : 메모리 보기 도구를 사용하여 메모리 사용량을 동적으로 확인합니다.

추천

출처blog.csdn.net/xudahai513/article/details/125826734