>Java >java지도 시간 >자바의 메모리 누수

자바의 메모리 누수

伊谢尔伦
伊谢尔伦원래의
2016-11-25 10:34:161531검색

Java 언어의 주요 장점은 메모리 관리 메커니즘입니다. 객체를 생성하기만 하면 Java의 가비지 수집기가 메모리 할당 및 회수를 도와줍니다. 그러나 Java 애플리케이션에서는 여전히 메모리 누수가 발생하기 때문에 실제 상황은 그렇게 간단하지 않습니다.

다음은 메모리 누수가 무엇인지, 왜 발생하는지, 어떻게 예방할 수 있는지 설명합니다.

 1. 메모리 누수란?

메모리 누수의 정의: 객체는 더 이상 애플리케이션에서 사용되지 않지만 객체는 여전히 참조 중이므로 가비지 수집기가 해당 객체를 제거할 수 없습니다.

이 정의를 이해하려면 먼저 메모리에 있는 객체의 상태를 이해해야 합니다. 아래 그림은 쓸모없는 객체가 무엇인지, 참조되지 않는 객체가 무엇인지 설명합니다.

자바의 메모리 누수

위 그림을 보면 알 수 있듯이 참조된 객체와 참조되지 않은 객체가 있습니다. 참조되지 않은 개체는 가비지 수집기에 의해 수집되지만 참조된 개체는 수집되지 않습니다. 물론 참조되지 않은 객체는 더 이상 참조하는 객체가 없기 때문에 더 이상 사용되지 않는 객체입니다. 그러나 쓸모없는 객체가 모두 참조되지 않는 객체는 아닙니다. 그 중 일부가 인용되었습니다. 메모리 누수가 발생하는 것은 바로 이러한 상황입니다.

 2. 메모리 누수는 왜 발생하나요?

먼저 다음 예시를 통해 메모리 누수가 발생하는 이유를 살펴보겠습니다. 다음 예에서 객체 A는 객체 B를 참조합니다. 객체 A의 수명 주기(t1-t4)는 객체 B의 수명 주기(t2-t3)보다 훨씬 깁니다. B 개체가 응용 프로그램에서 사용되지 않는 경우 A 개체는 여전히 B 개체를 참조합니다. 이러한 방식으로 가비지 수집기는 메모리에서 B 개체를 제거할 수 없으며, 이로 인해 메모리 문제가 발생합니다. A가 이러한 개체를 더 많이 참조하면 참조되지 않은 개체가 더 많이 존재하고 메모리 공간을 소비하게 되기 때문입니다.

객체 B에는 다른 많은 객체도 포함될 수 있으며 이러한 객체는 가비지 수집기에 의해 재활용되지 않습니다. 이러한 사용되지 않은 모든 개체는 이전에 할당된 메모리 공간을 계속해서 소비합니다.

자바의 메모리 누수

 3. 메모리 누수를 방지하는 방법은 무엇인가요?

다음은 메모리 누수 발생을 방지하는 데 도움이 되는 사용하기 쉬운 몇 가지 제안 사항입니다.

종종 메모리 누수를 일으키는 HashMap 및 ArrayList와 같은 일부 컬렉션 개체에 특별한 주의를 기울이세요. 정적으로 선언되면 수명은 애플리케이션만큼 길어집니다.

이벤트 청취 및 콜백 기능에 특히 주의하세요. 리스너는 사용 중에 등록되지만 더 이상 사용되지 않을 때 등록이 취소되지는 않습니다.

"클래스가 자체 메모리를 관리하는 경우 개발자는 메모리 누수에 주의해야 합니다." 일반적으로 일부 멤버 변수는 다른 객체를 참조하므로 초기화 중에 비워 두어야 합니다.

작은 질문: JDK6의 substirng() 메서드가 메모리 누수에 취약한 이유는 무엇입니까?

위 질문에 답하려면 JDK 6 및 7의 Substring()을 살펴보는 것이 좋습니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.