자바 쓰레기 회수 루트 검색 알고리즘

3027 단어 Java
1.루트 검색 알고리즘
자바 는 루트 검색 알고리즘 을 사용 하여 쓰레기 를 회수 합 니 다.이 알고리즘 의 기본 원 리 는 GC Roots 라 는 일련의 대상 을 기점 으로 하고 출발점 에서 아래로 검색 하 며 검색 한 경 로 를 인용 체인 이 라 고 합 니 다.
대상 이 GC Roots 에 연결 되 지 않 으 면 이 대상 이 사용 할 수 없다 는 것 을 설명 합 니 다.이때 자바 가상 기 는 이 대상 을 회수 할 수 있 습 니 다.
자바 가상 머 신 은 다음 대상 을 GC Roots 로 정의 합 니 다.
  • 자바 가상 컴퓨터 스 택 에서 인용 한 대상:예 를 들 어 방법 에서 이러한 부분 변수 User user=new User()를 정의 합 니 다
  • 정적 속성 참조 대상:예 를 들 어 private static User user=new User();

  • 상수 참조 대상:예 를 들 어 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    ");
    		}
    	}
    }
    

     
     
     

    좋은 웹페이지 즐겨찾기