Java 가비지 컬렉션과 객체 수명주기에 대한 자세한 설명
Java의 가비지 컬렉션과 객체 라이프사이클
1. 가비지 컬렉션
가비지 컬렉션은 Java의 메모리입니다. 프로그래밍 관리의 핵심 개념인 JVM의 메모리 관리 메커니즘을 가비지 수집 메커니즘이라고 합니다.
객체가 생성된 후 JVM의 힙 메모리에 배치됩니다. 이 객체가 참조되지 않으면 힙 메모리에서 JVM에 의해 재활용됩니다. 생성된 객체는 복제할 수 없으며, 프로그램 명령문을 통해 해제할 수 있는 방법이 없습니다. 즉, JVM 런타임 공간의 루트 컬렉션을 통해 객체에 도달(발견)할 수 없는 경우 해당 객체를 가비지 객체라고 합니다. 루트 컬렉션은 클래스의 정적 참조 필드와 로컬 참조 필드로 구성됩니다. JVM은 루트 컬렉션을 통해 객체를 인덱싱합니다.
Java 애플리케이션을 개발할 때 JVM에서 관리하는 두 가지 유형의 메모리인 힙 메모리와 스택 메모리가 자주 사용됩니다. 간단히 말해서, 힙 메모리는 주로 런타임 시 프로그램에 의해 생성되거나 인스턴스화되는 개체 및 변수를 저장하는 데 사용됩니다. 예를 들어 new 키워드를 통해 생성된 개체입니다. 스택 메모리는 프로그램 코드에서 정적 또는 비정적으로 선언된 메서드를 저장하는 데 사용됩니다.
(1) 힙 메모리
힙 메모리는 JVM이 시작될 때 생성됩니다. 힙 메모리에 저장된 객체는 JVM에 의해 자동으로 재활용될 수 있으며 다른 외부 수단으로는 재활용될 수 없습니다. 개발자는 관련 코드를 추가하여 힙 메모리의 개체를 회수할 수 없습니다. 힙 메모리는 일반적으로 새 개체 영역과 이전 개체 영역의 두 가지 영역으로 나뉩니다.
새로운 개체 영역: Eden 영역, From 영역 및 To 영역의 세 가지 작은 영역으로 세분화될 수 있습니다. Eden 영역은 새로 생성된 객체를 저장하는 데 사용되며 스택에 대한 포인터가 커지는 것처럼 새 객체가 생성됩니다. 섹스 테스트의 임무는 루트 컬렉션에서 도달할 수 없는 객체를 감지하는 것입니다. 이러한 객체는 JVM에 의해 재활용될 수 있으며 모든 활성 객체는 Eden 영역에서 To 영역으로 복사됩니다. 일부 객체는 To 영역에서 From 영역으로 전송됩니다. 위의 객체 마이그레이션 전체 프로세스는 JVM에 의해 제어됩니다.
이전 개체 영역: 이전 개체 영역의 개체는 여전히 긴 수명 주기를 갖습니다. 대부분의 JVM 시스템 가비지 개체는 일정 기간이 지나면 "단기 수명" 개체에서 발생합니다. 오래된 개체 영역은 쓰레기 개체가 됩니다. 이때 JVM 시스템은 이러한 가비지 개체를 자동으로 재활용합니다. 가비지 수집 작업을 완료하기 위해 JVM이 제한된 시스템 리소스를 사용하기 때문에 시스템이 자주 가비지 수집을 수행하도록 하지 않는 것이 좋습니다. 첫째, 애플리케이션의 결과 사용자 측의 요청에 신속하게 응답할 수 없으면 시스템의 전반적인 성능에 영향을 미치게 됩니다.
(2) 스택 메모리
힙 메모리는 주로 런타임 중에 프로그램이 생성하거나 인스턴스화한 개체 및 변수를 저장하는 데 사용됩니다. 예를 들어 new 키워드를 통해 생성된 개체입니다. 스택 메모리는 프로그램 코드에서 정적 또는 비정적으로 선언된 메서드를 저장하는 데 사용됩니다.
2. JVM의 객체 라이프사이클
JVM 런타임 공간에서 객체의 전체 라이프사이클은 대략 7단계로 나눌 수 있습니다.
생성 단계 ;
적용 단계;
도달할 수 없는 단계;
최종 단계; >
릴리스 단계 위의 7단계는 JVM 개체의 전체 수명 주기를 구성합니다. (1) 생성 단계 객체 생성 단계에서 시스템은 주로 다음 단계를 통해 객체 생성 프로세스를 완료합니다.<1>
<2> 슈퍼 클래스의 생성자를 재귀적으로 호출합니다. <5> 호출됩니다.
& lt; 2 & gt; 해당 물건이 제때에 쓰레기 재활용 기준을 충족하도록 노력하세요. 예를 들어 myObject = null입니다.
& lt; 3 & gt; 너무 깊은 상속 수준을 채택하지 마세요.
(2) 신청단계
개체 참조 단계에서 개체는 다음과 같은 특성을 갖습니다.
<1> 시스템은 개체에 대해 하나 이상의 강력한 참조(Strong Reference)를 유지합니다. > ; 객체에 대한 모든 참조는 강력한 참조입니다(명시적으로 적용하지 않는 한: 소프트 참조, 약한 참조 또는 팬텀 참조).
import java.lang.ref.SoftReference; ... A a = new A(); ... // 使用a ... // 使用完了a, 将它设置为soft引用类型,并且释放强引用 SoftReference sr = new SoftReference(a); a = null; ... // 下次使用时 if (sr != null) { a = sr.get(); } else { // GC由于低内存,已释放a,因此需要重新装载 a = new A(); sr = new SoftReference(a); }
약한 참조: 약한 응용 프로그램 객체와 소프트 참조 객체의 가장 큰 차이점은 GC가 가비지 수집을 수행할 때 소프트 응용 프로그램 객체의 재활용 여부를 확인하는 알고리즘을 사용해야 한다는 것과 약한 참조에 대한 것입니다. , GC는 항상 수집합니다. 약한 참조 객체는 GC에서 재활용하기가 더 쉽고 빠릅니다. 약한 참조 객체는 맵 구조에서 자주 사용됩니다.
import java.lang.ref.WeakReference; ... A a = new A(); ... // 使用a ... // 使用完了a, 将它设置为Weak引用类型,并且释放强引用 WeakReference wr = new WeakReference(a); a = null; ... // 下次使用时 if (wr != null) { a = wr.get(); } else { a = new A(); wr = new WeakReference(a); }
객체가 Invisible 단계에 있다는 것은 더 이상 코드의 다른 영역에서 참조할 수 없고 해당 Strong Reference가 사라진다는 의미입니다. 예를 들어 지역 변수는 가시적인
범위를 초과합니다.
try { Object localObj = new Object(); localObj.doSomething(); } catch (Exception e) { e.printStackTrace(); } if (true) { // 此区域中localObj 对象已经不可视了, 编译器会报错。 localObj.doSomething(); }
(4) 도달 불가능 단계
도달 불가능 단계의 객체는 더 이상 가상 머신의 객체 참조 루트 컬렉션에서 직접 또는 간접적인 강력한 참조를 찾을 수 없습니다. 모든 스레드 스택의 임시 변수. 로드된 모든 정적 변수 또는 네이티브 코드 인터페이스에 대한 참조입니다.
개체가 수집 가능 단계, 최종 단계 및 릴리스 단계에 있을 때 개체는 다음 세 가지 상황을 갖습니다. 🎜>
<1> 수집가가 해당 개체에 더 이상 접근할 수 없음을 발견했습니다.
<2> finalize 메소드가 실행되었습니다.
<3> 개체 공간이 재사용되었습니다.
읽어주셔서 감사합니다. 도움이 되기를 바랍니다. 이 사이트를 지원해 주셔서 감사합니다!
Java의 가비지 수집 및 개체 수명 주기에 대한 자세한 설명에 대한 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!