>  기사  >  Java  >  Java의 메모리 누수 개요

Java의 메모리 누수 개요

Y2J
Y2J원래의
2017-04-21 16:33:461753검색

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

다음은 메모리 누수가 무엇인지, 왜 발생하는지, 이를 방지할 수 있는 방법에 대해 설명합니다.

 1. 메모리 누수란?

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

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

미사용 및 참조되지 않음

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

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

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

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

Object-Life-Time

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

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

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

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

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

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

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

위 내용은 Java의 메모리 누수 개요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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