Java에서 메모리 누수 찾기

Shubham Vora 2023년6월20일
  1. Java에서 메모리 누수의 원인
  2. Java에서 메모리 누수 찾기
Java에서 메모리 누수 찾기

이 기사에서는 Java 메모리 누수를 찾는 방법을 알려줍니다.

추가 메모리 공간을 차지하는 사용하지 않는 항목을 메모리 누수라고 합니다. 메모리 누수는 메모리 리소스를 막고 시간이 지남에 따라 시스템 성능을 저하시키기 때문에 문제가 됩니다.

이 문제가 해결되지 않으면 결국 프로그램의 리소스가 부족해지고 치명적인 java.lang.OutOfMemoryError와 함께 충돌이 발생합니다.

주요 장점 중 하나는 Java에 내장된 Garbage Collector가 제공하는 자동 메모리 관리입니다. 가비지 수집기는 메모리 할당 및 해제를 암시적으로 처리하므로 대부분의 메모리 누수 문제를 해결할 수 있습니다.

가비지 수집기는 많은 양의 메모리를 성공적으로 관리하지만 메모리 누수에 대한 안전 장치를 제공할 수 없습니다. 가비지 컬렉터는 지능적이지만 완벽하지는 않습니다.

성실한 개발자가 만든 앱도 메모리 누수에 취약합니다.

Java에서 메모리 누수의 원인

Java 메모리 누수는 응용 프로그램이 더 이상 필요하지 않은 개체 참조를 실수로 보류할 때 자주 발생합니다. Java 가비지 수집 프로세스는 의도하지 않은 개체 참조로 인해 이러한 개체에서 사용하는 메모리를 해제할 수 없습니다.

다음은 메모리 누수의 가장 일반적인 원인 중 일부입니다.

  1. 제한 없는 캐시.
  2. 다수의 세션 개체.
  3. 삭제하지 않고 컬렉션 객체에 삽입.
  4. 사용하지 않는 리스너 메서드.
  5. 운영 체제에서 과도한 페이지 전환.
  6. 잘못 작성된 사용자 정의 데이터 구조.

Java에서 메모리 누수 찾기

메모리 누수를 찾는 절대적인 방법이 없기 때문에 메모리 누수를 찾는 것은 어려울 수 있습니다. Java에서 메모리 누수를 찾기 위한 몇 가지 효율적인 방법이 있으며 그 방법은 다음과 같습니다.

메모리 프로파일러 사용

Java 프로파일링을 사용하면 메서드 실행, 개체 생성, 스레드 실행 및 쓰레기 수집과 같은 많은 JVM 특성을 추적할 수 있습니다. 메모리 프로파일러는 사용 중인 메모리 양을 추적하고 애플리케이션에서 메모리 누수를 찾는 데 도움을 줄 수 있습니다.

프로파일러는 또한 각 함수가 메모리와 CPU를 얼마나 많이 사용하는지와 같이 애플리케이션 내에서 리소스가 할당되는 방식을 검사하는 데 도움을 줄 수 있습니다. 메모리 프로파일러를 사용하여 문제를 식별하고 찾을 수 있습니다.

Java 프로파일링 도구를 사용하면 다음 메트릭을 검색할 수 있습니다.

  1. 메소드 호출 내역
  2. 메모리 사용
  3. 메서드의 CPU 시간
  4. 생성된 개체
  5. 가비지 수집기에 의해 제거된 객체.

힙 덤프 사용

Java에서 메모리 누수를 찾는 또 다른 기술입니다. 힙 덤프는 특정 순간에 Java 애플리케이션이 사용하는 힙 메모리의 스냅샷을 제공합니다.

열린 객체 인스턴스의 수와 메모리 사용량을 나타냅니다. 힙 덤프는 응용 프로그램에서 생성되는 개체 수와 메모리 누수를 일으킬 수 있는 개체가 있는지 확인하는 데 도움이 될 수 있습니다.

장황한 가비지 수집

상세 가비지 수집을 활성화하여 Java 가비지 수집의 심층 추적을 얻을 수 있습니다. 상세 가비지 콜렉션을 사용하려면 다음 인수를 JVM 구성에 추가하십시오.

-verbose:gc

기본 오류 보고서로 표시되는 요약을 사용하여 메모리 처리 방법을 알아보고 메모리 누수를 발견할 수 있습니다.

Eclipse 메모리 누수 경고 사용

Eclipse의 메모리 누수 경고를 사용하는 것은 메모리 누수를 발견하는 또 다른 방법입니다. Eclipse는 참조가 종료될 때 경고할 수 있지만 코드가 JDK 1.5 이상을 준수하는 경우 객체가 계속되고 닫히지 않습니다.

프로젝트 설정이 누출 감지를 허용하는지 확인하십시오. Eclipse를 활용하는 것이 완전한 솔루션이 아닐 수도 있음을 명심하십시오.

특히, 코드가 JDK 1.5(또는 그 이상)와 호환되지 않는 경우 Eclipse는 모든 누출을 포착하지 못하고 일부 파일 폐쇄를 감지하지 못할 수 있습니다.

기타 도구

  1. NetBeans 프로파일러 – 메모리, 스레드 및 CPU 리소스를 모니터링할 수 있으며 Java SE, Java FX, EJB, 모바일 앱 및 웹 애플리케이션을 지원합니다.

  2. VisualVM – NetBeans 플랫폼에 구축된 VisualVM은 다양한 플러그인을 사용하여 원격 및 로컬 프로그램 모니터링을 위한 애플리케이션에 대한 광범위한 정보를 제공하는 쉽게 확장 가능한 도구입니다. 이 프로그램을 사용하면 가비지 수집기를 수동으로 실행하고 메모리 프로파일링을 얻을 수 있습니다.

  3. JProfiler – 메모리 누수 및 기타 성능 문제를 검사할 수 있는 스레드, 메모리 및 CPU를 프로파일링하는 도구입니다.

  4. GCeasyGCeasy는 가비지 수집 로그를 분석하고 가비지 수집 로그를 검토하면서 메모리 누수 문제를 찾는 간단한 접근 방식을 제공하는 도구입니다. GCeasy의 사용은 컴퓨터 설치 없이 온라인으로 액세스할 수 있다는 사실에 의해 더욱 권장됩니다.

  5. GC Viewer - JVM 데이터를 이용하여 쉽고 빠르게 정보 시각화를 할 수 있는 오픈 소스 프로그램입니다. GC 뷰어는 누적 일시정지, 최대 연장 일시정지 및 처리량과 같은 가비지 수집 성능 정보를 표시합니다.

    이 프로그램을 사용하면 가비지 수집을 시작할 수 있을 뿐만 아니라 초기 힙 크기를 지정할 수도 있습니다.

  6. Patty in action – 자신을 프로파일링하고 대상이 되는 심층 프로파일링을 얻는 데 사용할 수 있는 또 다른 오픈 소스 프로그램입니다. 이 도구는 힙을 검사하는 데 사용할 수 있습니다.

  7. JRockitJRockit은 지연을 예측하고 가비지 수집을 표시하고 메모리 관련 문제를 분석할 수 있는 Java SE 애플리케이션용 독점 Oracle 솔루션입니다.

이 자습서에서는 Java의 메모리 누수, 다양한 원인 및 이를 찾는 방법에 대해 배웠습니다. 이 자습서에서는 다양한 도구와 기술에 대해 설명합니다.

사용자는 응용 프로그램의 성능을 향상시키기 위해 메모리 누수를 줄이는 기술과 도구를 따를 수 있습니다.

작가: Shubham Vora
Shubham Vora avatar Shubham Vora avatar

Shubham is a software developer interested in learning and writing about various technologies. He loves to help people by sharing vast knowledge about modern technologies via different platforms such as the DelftStack.com website.

LinkedIn GitHub