자바 의 몇 가지 인용 유형

9898 단어 자바 기반
개술
자바 에는 네 가지 유형의 인용 이 존재 합 니 다.강 한 인용,부 드 러 운 인용,약 한 인용 과 허 인용 입 니 다.
이 네 가지 인용 유형 은 우리 로 하여 금 대상 의 생명 주 기 를 결정 하고 JVM 의 GC 회수 에 유리 하 며 메모리 유출 과 메모리 유출 에 더욱 좋 은 해결 경 로 를 가 질 수 있다.
자바 의 몇 가지 인용 유형 과 접근 성
참조 형식
접근 성
존재 방식
GC 회수 방식
강하 게 도달 할 수 있다
억지로 인용 하 다
하나의 스 레 드 에서 인용 없 이 직접 도달 할 수 있 습 니 다.
인용 이 존재 하 는 경우 회수 되 지 않 습 니 다.
부 드 럽 게 접근 할 수 있다
소프트 인용SoftReference 대상 통과 가능
메모리 부족 시 사용 빈도 에 따라 제거
약 하 다
약 인용WeakReference 대상 통과 가능
GC 호출 시 반드시 회수
허 다 하 다
거짓 인용PhantomReference 대상 통과 가능
생명주기 에 영향 을 주지 않다
도달 할 수 없다
존재 하지 않 음
어떠한 방법 도 도달 할 수 없다
호출 즉시 제거
강 인용(강 참조)
  • 강 인용 은 가장 많이 사용 되 는 인용 으로 인용 이 존재 하면 회수 되 지 않 는 다.
  • 은 쌓 인 대상 인 스 턴 스 에 인용 이 없 을 때 만 회수 된다.
  • 대상 인 스 턴 스 의 공간 을 방출 하려 면 모든 인용(null 부여)
  • 을 닫 아야 합 니 다.
    String str = new String("This is a Strong Reference");//   
    
    str = null; 
    System.gc(); //  gc    
    

    일반적으로 우 리 는 gc 를 수 동 으로 호출 하여 회수 할 필요 가 없 으 며,시스템 은 자동 으로 진행 되 며,여 기 는 단지 시범 일 뿐이다.또 주의해 야 할 것 은 System.gc() 은 gc 에 게 만 회수 하 라 고 통지 할 뿐 즉시 실행 되 는 것 이 아니다.
    소프트 참조(소프트 참조)
  • 소프트 인용 은 그다지 중요 하지 않 은 대상 을 인용 할 수 있 고 잃 기 쉬 운 대상 일 수 있다.
  • 소프트 참조 대상 인 스 턴 스 는 메모리 가 부족 할 때 만 JVM 이 사용 빈도 에 따라
  • 을 회수 합 니 다.
  • 은 자바 에서 java.lang.ref.SoftReference 류 로
  • 을 나타 낸다.
  • 소프트 인용 을 유연 하 게 사용 하면 많은 OOM(OutOf Memory)문 제 를 해결 할 수 있 습 니 다
  • 응용 장면:이미지 캐 시,웹 캐 시...
  • 1)       
    SoftReference<String> sr = new SoftReference<String> (new String("Soft Reference"));
    System.gc();
    System.out.println(sr.get());
    
    2)      
    ReferenceQueue<String> Queue = new ReferenceQueue<String>();
    SoftReference<String> sr = new SoftReference<String> (new String("Soft Reference"),Queue);
    System.gc();
    System.out.println(sr.get());
    

    인용 대기 열 을 추가 할 수 있 습 니 다.이렇게 하면 부 드 러 운 인용 대상 인 스 턴 스 가 JVM 에 회수 되면 이 부 드 러 운 인용 은 연 결 된 인용 대기 열 에 추 가 됩 니 다.
    약 인용(WeakReference)
  • 약 한 인용 은 보통 임시 인용 으로
  • 을 사용한다.
  • 약 인용 대상 인 스 턴 스 는 시스템 이 gc 를 호출 하여 회수 할 때 반드시
  • 으로 청 소 됩 니 다.
  • java.lang.ref.WeakReference 류 로
  • 을 나타 낸다.
    WeakReference<String> wr = new WeakReference<String>(new String("Weak Reference"));
    System.gc();
    System.out.println(wr.get());
    

    가상 인용(PhantomReference)
    유일한 목적 은 이 대상 이 회수 되 었 을 때 시스템 알림 을 받 을 수 있 는 것 입 니 다.가상 인용 은 주로 대상 이 메모리 에서 삭제 되 었 는 지 확인 하 는 데 사 용 됩 니 다.
  • 가상 인용 은 대상 이 메모리 에서 삭제 되 었 는 지 검사 하 는 데 사용 되 며,하나의 가상 인용 대상 만 의미 가 없 으 며,gc 에 의 해 회수 된다.
  • 과 소프트 인용 과 약 인용 이 다른 것 은 대상 의 생명 주기 에 영향 을 주지 않 는 다 는 것 이다
  • 허 인용 은 반드시 인용 대기 열과 함께
  • 을 사용 해 야 한다
    String str = new String("This is a Phantom Reference")
    ReferenceQueue<String> Queue = new ReferenceQueue<String>();
    PhantomReference<String> pr = new PhantomReference<String>(str,Queue);
    str = null;
    System.gc();
    System.out.println(pr.isEnqueued());//         
    

    좋은 웹페이지 즐겨찾기