이전 글에서 자동 메모리 관리는 객체에 메모리를 할당하는 부분과 객체에 할당된 메모리를 재활용하는 두 부분으로 나누어진다고 말씀드렸습니다. 이 기사에서는 후자, 즉 객체에 할당된 메모리를 재활용하는 방법에 대해 설명합니다. 메모리를 재활용하려면 영어 이름이 GC(Garbage Collection)인 가비지 수집 메커니즘을 사용해야 합니다.
이 부분에서는 다음 질문을 해결해야 합니다.
1. 어떤 메모리를 재활용해야 합니까?
2. 언제 재활용되나요?
3. 재활용하는 방법은 무엇인가요?
어떤 메모리를 재활용해야 하나요?
힙 및 메소드 영역의 메모리는 재활용해야 하며 나머지는 재활용할 필요가 없습니다.
힙과 메소드 영역만 스레드로 공유되고 나머지는 스레드와 함께 "살고 죽기" 때문에 스레드가 끝나면 메모리가 자연스럽게 재활용되므로 걱정하지 마세요.
언제 재활용되나요?
(1) 힙에서:
객체가 "죽으면" 메모리를 재활용해야 합니다. 물체가 죽었다는 것은 무엇을 의미합니까? 참고할 곳도 없고 쓸모도 없습니다. 그럼 죽었는지 어떻게 알 수 있나요?
두 가지 방법이 있습니다:
참조 카운팅 알고리즘
참조할 장소가 있을 때마다 카운터 값은 +1이 됩니다. 카운터의 값은 -1입니다. 카운터 값이 0이면 이 개체는 더 이상 참조되지 않는다는 의미입니다. 즉, "죽을 수 있습니다"라는 의미입니다.
하지만 여기에는 순환 참조 문제라는 단점이 있습니다. 아래 그림과 같이 힙에 있는 두 객체는 쓸모가 없어도 서로를 참조하고 카운터 값이 1 이상이므로 재활용할 수 없습니다.
접근성 분석
생성된 모든 개체는 "GC Roots"라는 루트의 하위 트리입니다. GC Roots에서 시작하여 아래쪽으로 검색하는 동안 검색이 이동한 경로를 참조 체인이라고 합니다. 개체에 GC 루트에 도달하기 위한 참조 체인이 없으면 해당 개체는 도달할 수 없다고 합니다. 즉, GC에서 재활용할 수 있습니다. 이는 Java에서 일반적으로 사용되는 방법입니다.
아래 그림의 힙에 있는 참조되지 않은 개체와 마찬가지로 재활용이 가능합니다.
객체에 여전히 참조가 있는지 확인하는 방법은 무엇입니까? Java에는 네 가지 유형의 참조가 있습니다.
강한 참조: Object o=new Object(). 강력한 참조가 존재하는 한 GC는 참조된 개체를 재활용하지 않습니다.
소프트 참조: 유용하지만 필요하지 않은 일부 개체를 설명합니다. 시스템 메모리가 오버플로될 경우 재활용됩니다.
약한 참조: GC가 수행되는 한 재활용됩니다.
가상 참조: 이것은 가장 약한 참조 관계입니다. 가상 참조를 통해서는 객체 인스턴스를 얻을 수 없습니다. 그 기능은 이 객체가 수집기에 의해 재활용될 때 시스템 알림을 받는 것입니다.
(2) 메소드 영역에서:
메소드 영역에는 클래스 정보, 상수, 정적 변수, JIT(Just-In-Time) 컴파일러에 의해 컴파일된 코드 및 다음에 의해 로드된 기타 데이터가 저장된다는 것을 알고 있습니다. 가상 머신. 그래서 우리는 메서드 영역에서 가비지 수집을 수행하여 버려진 상수와 쓸모 없는 클래스를 재활용합니다.
상수가 더 이상 사용되지 않는지 어떻게 확인하나요?
참조 횟수를 살펴보세요. 상수를 참조하는 객체가 없으면 해당 상수가 폐기되어 재활용될 수 있다는 뜻입니다.
수업이 쓸모 없는지 어떻게 판단하나요?
세 가지 상황이 있습니다.
a 이 클래스의 모든 인스턴스가 재활용되었습니다.
b. 이 클래스를 로드한 ClassLoader가 재활용되었습니다.
c. 이 클래스에 해당하는 java.lang.Class 객체는 어디에서도 참조되지 않으며, 리플렉션을 통해 이 클래스의 메서드에 액세스할 수 없습니다.
재활용하는 방법?
이론에는 4가지 알고리즘이 있습니다:
• 마크 스윕 알고리즘
• 복사 알고리즘
• 마크 대조 알고리즘
• 세대별 수집 알고리즘
구현에는 5개의 수집기가 있습니다:
#ㅋㅋㅋ 🎜🎜#메모리 오버플로: 시스템이 더 이상 필요한 공간을 할당할 수 없습니다. 예를 들어, 힙의 새 개체에 더 이상 메모리를 할당할 수 없으며, 스택이 가득 차면 새 스택 프레임을 스택에 푸시할 수 없습니다.
메모리 누수: 메모리가 객체에 의해 점유되어 반환되지 않는 경우를 메모리 누수라고 합니다.위는 JVM의 가비지 수집 메커니즘에 대한 자세한 설명입니다. 더 많은 관련 질문을 보려면 PHP 중국어 웹사이트를 방문하세요. JAVA 비디오 튜토리얼# 🎜🎜#
위 내용은 JAVA Virtual Machine(JVM)에 대한 자세한 소개(3) - 가비지 수집 메커니즘의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!