Java 스팸 복구 및 객체 라이프 사이클 상세 정보
Java의 쓰레기 수거 및 객체 라이프 사이클
1. 쓰레기 수거
쓰레기 회수는 자바 프로그램 설계에서 메모리 관리의 핵심 개념으로 JVM의 메모리 관리 메커니즘은 쓰레기 회수 메커니즘이라고 불린다.
객체가 생성된 후 JVM의 더미 메모리에 배치됩니다. 이 객체를 영원히 참조하지 않으면 JVM이 더미 메모리에서 회수됩니다.생성된 개체는 재생성할 수 없으며 프로그램 문장을 통해 방출할 수 없습니다.즉, 객체가 JVM 실행 공간에서 루트 컬렉션을 통해 도달할 수 없을 때 이 객체를 스팸 객체라고 합니다.루트 집합은 클래스의 정적 인용역과 로컬 인용역으로 구성되어 있습니다.JVM은 루트를 통해 객체를 인덱스합니다.
Java 응용 프로그램을 개발할 때 JVM이 관리하는 두 가지 유형의 메모리: 더미 메모리와 창고 메모리를 자주 사용합니다.간단하게 말하자면, 메모리 더미는 주로 프로그램이 실행할 때 만들거나 실례화된 대상과 변수를 저장하는 데 쓰인다.예를 들어 new 키워드를 통해 만든 대상입니다.창고 메모리는 프로그램 코드에 정적 또는 비정적으로 표시되는 방법을 저장하는 데 쓰인다.
(1) 메모리 더미
더미 안에 JVM이 시작될 때 생성되고 더미 메모리에 저장된 대상은 JVM에 의해 자동으로 회수될 수 있으며 다른 외부 수단을 통해 회수할 수 없다. 즉, 개발자는 관련 코드를 추가하는 수단을 통해 더미 메모리에 저장된 대상을 회수할 수 없다.메모리 더미는 통상적으로 두 개의 구역으로 나뉘는데 그것이 바로 새로운 대상 구역과 오래된 대상 구역이다.
새 대상 구역: 에덴동산 구역, 프롬 구역과 To 구역으로 세분화할 수 있습니다.에덴동산 구역은 새로 만든 대상을 저장하는 데 사용된다. 이것은 하나의 창고와 같다. 새로운 대상이 만들어지고 이 창고를 가리키는 바늘이 늘어나는 것과 같다. 에덴동산 구역의 대상이 가득 차면 JVM 시스템은 가달성 테스트를 해야 한다. 주요 임무는 어떤 대상이 루트 집합에서 출발하여 도달할 수 없는지 검사하는 것이다. 이 대상은 JVM에 의해 회수되고 모든 활동 대상을 에덴동산 구역에서 To구역으로 복사할 수 있다.이때 일부 대상은 상태 교환이 발생하고, 어떤 대상은 To 구역에서 From 구역으로 옮겨지고, 이때 From 구역에 대상이 있다.위 객체 마이그레이션의 전체 프로세스는 JVM 제어로 수행됩니다.
오래된 대상 구역: 오래된 대상 구역에 있는 대상은 여전히 긴 생명 주기를 가진다. 대부분의 JVM 시스템 쓰레기 대상은 모두'단명'대상에서 유래한 것이다. 일정 시간이 지난 후에 오래된 대상 구역으로 전입된 대상은 쓰레기 대상이 된다.이때 이들은 모두 상응하는 표시를 하고 JVM시스템은 이러한 쓰레기 대상을 자동으로 회수할 것이다. 빈번하게 시스템을 쓰레기 회수로 강제하지 않는 것을 권장한다. 이것은 JVM이 유한한 시스템 자원을 이용하여 쓰레기 회수 작업을 우선적으로 완성하기 때문에 응용 프로그램이 사용자 측의 요청에 신속하게 응답하지 못해 시스템의 전체 성능에 영향을 줄 수 있기 때문이다.
(2) 스택 메모리
메모리 더미는 주로 프로그램이 실행할 때 만들거나 실례화된 대상과 변수를 저장하는 데 쓰인다.예를 들어 new 키워드를 통해 만든 대상입니다.창고 메모리는 프로그램 코드에 정적 또는 비정적으로 표시되는 방법을 저장하는 데 쓰인다.
2. JVM에서 객체의 라이프 사이클
JVM 실행 공간에서 객체의 전체 라이프 사이클은 크게 7단계로 나눌 수 있습니다.
(1) 작성 단계
객체 작성 단계에서 시스템은 주로 다음 단계를 통해 객체 작성 프로세스를 완료합니다.
<1> 대상에 저장 공간 분배;
<2>대상을 구성하기 시작;
<3> 초류에서 자류로 static 구성원을 초기화한다.
<4>초류 구성원 변수를 순서대로 초기화하고 초류의 구조 방법을 차례로 호출한다.
<5>자류 구성원 변수는 순서대로 초기화하고 자류 구조 방법은 호출한다.
객체를 작성할 때 다음과 같은 몇 가지 주요 적용 규칙에 유의해야 합니다.
<1> 메모리 공간이 많지 않아도 순환체에서 대상을 만드는 것을 피합니다.
<2> 가능한 한 신속하게 대상이 쓰레기 회수 기준에 부합되도록 한다.예를 들어 my Object =null.
<3> 지나치게 깊은 계승 단계를 채택하지 마라.
<4> 로컬 변수에 접근하는 것이 액세스 클래스의 변수보다 낫다.
(2) 적용 단계
객체의 참조 단계에서 객체에는 다음과 같은 피쳐가 있습니다.
<1> 시스템은 적어도 대상의 강력한 참조(Strong Reference)를 유지합니다.
<2> 모든 객체에 대한 참조는 강제 참조입니다(소프트 참조), 약한 참조(Weak Reference) 또는 거짓 참조(Phantom Reference)가 표시되지 않는 한 적용됩니다.
강제 참조(Strong Reference): JVM 메모리 관리자가 루트 참조 집합에서 출발하여 더미에 있는 모든 객체에 도달하는 경로를 반복합니다.어떤 대상에 도달하는 임의의 경로가 인용 대상을 포함하지 않을 때, 이 대상의 인용은 강한 인용이라고 부른다.
소프트 참조(Soft Reference): 소프트 참조의 주요 특징은 비교적 강한 참조 기능입니다.메모리가 부족할 때만 이런 메모리를 회수하기 때문에 메모리가 충분할 때 회수되지 않는다.또한 이 인용 대상은 자바가 Out Of Memory 이상을 던지기 전에null로 설정될 수 있습니다.이것은 자주 사용하는 자원의 캐시를 실현하고 Cache 기능을 실현하며 Out OfMemory를 일으키지 않고 메모리를 최대한 사용할 수 있습니다.
다음은 소프트 참조의 구현 코드입니다.
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);
}
소프트 인용 기술의 도입으로 자바 응용은 메모리를 더욱 잘 관리하고 시스템을 안정시키며 시스템 메모리가 넘치는 것을 방지하고 시스템 붕괴를 피할 수 있다.따라서 일부 메모리 사용량이 비교적 크고 생명주기가 길지만 번거롭지 않은 대상을 처리할 때 이 기술을 최대한 응용해야 한다.시스템의 안정성을 높이다. 약한 인용(Weak Reference): 약한 응용 대상과 소프트 인용 대상의 가장 큰 차이점은 GC가 쓰레기 수거를 할 때 알고리즘을 통해 Soft 응용 대상을 회수하는지 확인해야 한다는 것이다. 반면에 약한 인용에 대해 GC는 항상 회수를 한다.Weak 참조 객체는 GC에서 보다 쉽고 빠르게 회수됩니다.Weak 참조 객체는 맵 구조에서 자주 사용됩니다.
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);
}
거짓 참조(Phantom Reference): 거짓 참조의 용도는 비교적 적고, 주로finalize 함수의 사용을 보조하는 데 쓰인다.허인용(Phantom Reference) 대상은 finalize 함수를 실행하고 도달할 수 없는 대상을 가리키지만 GC에서 회수되지 않은 대상을 가리킨다.이러한 대상은finalize를 보조하여 후기의 회수 작업을 진행할 수 있습니다. 우리는 Refernce의clear() 방법을 덮어쓰고 자원 회수 메커니즘의 유연성을 강화했습니다.
실제 프로그래밍에서는 약한 인용과 거짓 인용을 거의 사용하지 않고 소프트 인용을 사용하는 경우가 많다. 소프트 인용은 JVM이 스팸 메모리에 대한 회수 속도를 가속화하고 시스템의 운행 안전을 유지하며 메모리 넘침(Out Of Memory) 등의 문제를 방지할 수 있기 때문이다.
(3) 보이지 않는 단계
대상이 보이지 않는 단계에 있으면 다른 영역의 코드에서 인용할 수 없으며, 강력한 인용은 사라집니다. 예를 들어 로컬 변수가 보기를 초과했습니다.
의 범위.
try {
Object localObj = new Object();
localObj.doSomething();
} catch (Exception e) {
e.printStackTrace();
}
if (true) {
// localObj , 。
localObj.doSomething();
}
(4) 도달 불가 단계도달할 수 없는 단계에 있는 대상은 가상 기기의 대상 인용 루트 집합에서 직접적이거나 간접적으로 강한 인용을 찾을 수 없습니다. 이런 대상은 일반적으로 모든 스레드 창고의 임시 변수입니다.이미 불러온 정적 변수나 로컬 코드 인터페이스에 대한 인용
(5) 수집 가능 단계, 종료 단계 및 방출 단계
객체가 수집 가능 단계, 종료 단계, 방출 단계에 있을 때 다음과 같은 세 가지 경우가 있습니다.
<1> 회수기에서 이 대상이 이미 도달할 수 없음을 발견했습니다.
<2>finalize 방법이 실행되었습니다.
<3> 대상 공간이 중용되었습니다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.