자바 쓰레기 회수 루트 검색 알고리즘
3027 단어 Java
자바 는 루트 검색 알고리즘 을 사용 하여 쓰레기 를 회수 합 니 다.이 알고리즘 의 기본 원 리 는 GC Roots 라 는 일련의 대상 을 기점 으로 하고 출발점 에서 아래로 검색 하 며 검색 한 경 로 를 인용 체인 이 라 고 합 니 다.
대상 이 GC Roots 에 연결 되 지 않 으 면 이 대상 이 사용 할 수 없다 는 것 을 설명 합 니 다.이때 자바 가상 기 는 이 대상 을 회수 할 수 있 습 니 다.
자바 가상 머 신 은 다음 대상 을 GC Roots 로 정의 합 니 다.
상수 참조 대상:예 를 들 어 private static final User user = new User();
로 컬 방법 스 택 에서 인용 한 대상2.인용의 정의
2.1 강 인용 강 참조
Object obj = new Object();
여기 서 obj 는 인용 입 니 다.new Object()대상 인 스 턴 스 는 메모리 에 저장 되 어 있 습 니 다.obj 는 대상 인 스 턴 스 의 메모리 주 소 를 참조 합 니 다.
obj=null 을 실행 하면 new Object()라 는 대상 인 스 턴 스 가 인용 되 지 않 은 것 처럼 보 입 니 다.
이 를 통 해 알 수 있 듯 이 인용 은 존재 하거나 존재 하지 않 는 다.보유 대상 을 인용 하지 않 으 면 대상 은 JVM 에서 회수 할 수 있다.
그러나 일부 캐 시 시스템 은 이 대상 들 이 그렇게 빨리 회수 되 지 않 기 를 바 라 며 JDK 1.2 이후 다른 3 가지 인용 유형 을 정의 했다.
2.2 소프트 인용 소프트 참조
사용 가능 하지만 살아 야 할 대상 은 아 닙 니 다.
메모리 가 넘 치기 전에 가상 컴퓨터 는 이 대상 들 을 회수 하려 고 시도 합 니 다.회수 후에 도 메모리 가 부족 해 야 메모리 가 넘 칠 수 있 습 니 다.
2.3 약 참조 Weak 참조
꼭 필요 하지 않 은 대상 을 묘사 하 는 것 이기 도 하지만 부 드 러 운 인용 보다 인용 이 약 하 다.
약 인용 관련 대상 은 다음 쓰레기 회수 가 발생 하기 전 까지 만 생존 할 수 있다.
쓰레기 회수 메커니즘 이 작 동 하기 만 하면 메모리 가 충분 하 든 상 관 없 이 이 부분 대상 을 회수 할 것 이다.
2.4 가상 인용 Phantom 참조
가장 약 한 인용 관계,한 대상 이 허위 인용 과 관련 이 있 는 지,생존 주기 에 전혀 영향 을 주지 않 는 다.
하나의 가상 인용 을 통 해 대상 의 인 스 턴 스 를 얻 을 수 없습니다!
3.루트 검색 알고리즘 의 스 팸 회수 실행 메커니즘
앞에서 루트 검색 알고리즘 과 인용 정 의 를 소 개 했 습 니 다.우 리 는[도달 할 수 없 는 대상]이 바로 JVM 회수 의 중점 대상 이라는 것 을 알 고 있 습 니 다.
그러나 인용 체인 이 도달 하지 못 하 더 라 도 이 대상 이 반드시 회수 된다 는 것 을 의미 하 지 는 않 습 니 다.회 수 는 두 번 의 태그 과정 을 거 쳐 야 하기 때 문 입 니 다!
첫 번 째 태그:대상 이 루트 검색 을 한 후 GC Roots 와 연 결 된 참조 체인 이 없 는 것 을 발견 하면 첫 번 째 태그 로 선별 합 니 다.
필터 란 이 대상 이 finalize 방법 을 실행 할 필요 가 있 는 지 확인 하 는 것 입 니 다.대상 이 이 방법 을 정의 하고 실행 하지 않 았 다 면.
그러면 이 대상 은 하나의 대기 열 F-Queue 에 들 어 갑 니 다.그 다음 에 이 대기 열 에 있 는 대상 의 finalize 방법 을 실행 하기 위해 낮은 우선 순위 의 스 레 드 가 있 습 니 다.
두 번 째 태그:JVM 은 F-Queue 대기 열 에 있 는 대상 을 두 번 째 로 표시 합 니 다.
대상 이 회수 되 지 않 으 려 면 finalize 방법 에서 자신 을 구 해 야 한다.그렇지 않 으 면 이 대상 들 은 정말 회수 된다.
다음 코드 예 시 를 보면 쓰레기 회수 의 기본 과정 을 알 수 있다
package reference.test;
/**
*
* @author yli
*
*/
public class GCRootsTest {
private static GCRootsTest obj;
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize !");
obj = this;
}
public static void main(String[] args) throws InterruptedException {
obj = new GCRootsTest();
obj = null;
System.gc();
Thread.sleep(500);
if (null != obj) {
System.out.println("1-obj !");
} else {
System.out.println("1-obj ");
}
obj = null;
System.gc();
Thread.sleep(500);
if (null != obj) {
System.out.println("2-obj !");
} else {
System.out.println("2-obj ");
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.