자바 의 인용 연구

5990 단어 자바학습 노트
Reference 는 추상 적 인 유형 이 고 SoftReference,Weak Reference,Phantom Reference 와 Final Reference 는 모두 이 를 계승 하 는 구체 적 인 유형 이다.
다음은 강 한 인용 과 자바.lang.ref 패키지 의 각종 가상 인용 특성 과 용법 을 소개 하고 분석 합 니 다.
StrongReference,SoftReference,WeakReference 및 PhantomReference 의 특성 및 용법
StrongReference:
JVM 의 대상 이 더미(heap)에 분 배 된 것 을 잘 알 고 있 습 니 다.프로그램 행동 에서 이 대상 을 가리 키 는 인용 이 없 을 때 이 대상 은 쓰레기 수 거 기 를 통 해 회수 할 수 있 습 니 다.여기 서 말 하 는 인용 은 우리 가 일반적으로 의미 에서 밝 힌 대상 유형의 변수(예 를 들 어 String,Object,ArrayList 등)이 고 원시 데이터 형식 과 구별 되 는 변수(예 를 들 어 int,short,long 등)도 강 한 인용 이 라 고 합 니 다.
허 인용 을 이해 하기 전에 우 리 는 일반적으로 강 인용 을 사용 하여 대상 을 인용 한다.예:
1. StrongReference usage
 String tag = new String("T"); 

이 곳 의 tag 인용 을 강 인용 이 라 고 합 니 다.강 한 인용 은 다음 과 같은 특징 이 있다.
강 한 인용 은 대상 에 직접 접근 할 수 있 습 니 다.
강 인용 이 가리 키 는 대상 은 언제든지 시스템 에서 회수 되 지 않 습 니 다.
강 한 인용 은 메모리 누 출 을 초래 할 수 있다.
우리 가 토론 하고 자 하 는 이 세 가지 Reference 는 강 한 인용 에 비해 모두'약 한 인용'에 속한다.즉,그들 이 인용 한 대상 이 강 한 인용 이 없 으 면 조건 에 따라 JVM 의 쓰레기 회수 기 에 의 해 회수 되 고 회수 되 는 시기 와 용법 이 각각 다르다 는 것 이다.다음은 각각 토론 을 진행 하 겠 습 니 다.
SoftReference:
소프트 레 퍼 런 스 는'약 인용'에서 가장 강 한 인용 에 속한다.SoftReference 가 가리 키 는 대상 은 가리 키 는 대상 을 강하 게 인용 하지 않 으 면 메모리 에 일정 시간 머 물 며,쓰레기 수 거 기 는 JVM 메모리 의 사용 현황(메모리 의 부족 정도)과 SoftReference 의 get()방법의 호출 상황 에 따라 회수 여 부 를 결정 합 니 다.(다음 장 에 서 는 몇 가지 실험 으로 논술 한다)
구체 적 으로 사용 하 는 것 은 일반적으로 SoftReference 의 구조 방법 을 통 해 약 한 인용 으로 가리 키 는 대상 을 포장 하 는 것 이다.필요 할 때 SoftReference 의 get()방법 으로 가 져 옵 니 다.대상 이 회수 되 지 않 았 을 때 SoftReference 의 get()방법 은 대상 의 강 한 인용 을 되 돌려 줍 니 다.다음 과 같다.
2. SoftReference usage
SoftReference bean = new SoftReference(new Bean("name", 10)); 
System.out.println(bean.get());// “name:10”

소프트 인용 은 다음 과 같은 특징 이 있 습 니 다.
소프트 인용 은 get()방법 으로 대상 의 강 한 인용 을 얻어 대상 에 접근 합 니 다.
소프트 인용 이 가리 키 는 대상 은 JVM 사용 현황(Heap 메모리 가 한도 값 에 가 까 운 지)에 따라 회수 여 부 를 결정 합 니 다.
소프트 인용 은 Heap 메모리 부족 으로 인 한 이상 을 피 할 수 있 습 니 다.
쓰레기 수 거 기 는 수 거 를 결정 할 때 SoftReference 를 비 웁 니 다.즉,SoftReference 의 get()방법 은 null 로 돌아 간 다음 대상 의 finalize()방법 을 호출 하여 다음 GC 에서 진정 으로 수 거 합 니 다.
WeakReference:
Weak Reference 는 SoftReference 보다 약 한 인용 유형 입 니 다.약 한 인용 특성 과 기본 은 소프트 인용 과 비슷 하 며,약 한 인용 이 가리 키 는 대상 이 시스템 쓰레기 를 회수 하면 메모리 사용 상황 에 상 관 없 이 영원히 회수(get()방법 으로 null)하 는 것 과 차이 가 있다.
SoftReference 와 같은 방식 으로 WeakReference 를 조작 할 수 있 습 니 다.여 기 는 다시 말 하지 않 겠 습 니 다.
약 인용 은 다음 과 같은 특징 이 있 습 니 다.
약 인용 은 get()방법 으로 대상 의 강 한 인용 을 얻어 대상 에 접근 합 니 다.
시스템 메모리 가 회수 되면 메모리 가 부족 하 든 약 한 참조 대상 이 회수 된다.
약 한 인용 도 Heap 메모리 부족 으로 인 한 이상 을 피 할 수 있 습 니 다.
PhantomReference:
PhantomReference 는 모든'약 한 인용'중 가장 약 한 인용 유형 입 니 다.소프트 인용 과 약 한 인용 과 달리 가상 인용 은 get()방법 을 통 해 목표 대상 의 강 한 인용 을 얻 을 수 없 으 며,원본 코드 를 관찰 하면 get()이 영원히 null 로 재 작성 되 는 것 을 발견 할 수 있 습 니 다.
그 허인 용 은 도대체 무슨 작용 이 있 습 니까?사실 가상 인용 은 주로 대상 이 쓰레기 로 회수 되 는 상 태 를 추적 하 는 데 사용 되 며,인용 대기 열 에 대상 이 해당 하 는 가상 인용 이 포함 되 어 있 는 지 확인 하여 쓰레기 로 회수 되 는 지 여 부 를 판단 하여 조 치 를 취한 다.대상 의 인용 을 기대 하지 않 고 대상 이 회수 되 기 전에 인용 은 Reference Queue 대상 에 넣 어 추적 대상 의 쓰레기 회수 역할 을 합 니 다.
따라서 구체 적 인 용법 은 이전 두 가지 와 다 르 기 때문에 하나의 Reference Queue 대상 에 들 어가 야 합 니 다.인용 대상 이 쓰레기 로 회수 되면 인용 은 이 대기 열 에 추 가 됩 니 다.예:
3. PhantomReference usage
public static void main(String[] args) { 
ReferenceQueue refQueue = new ReferenceQueue();
PhantomReference referent = new PhantomReference(
new String("T"), refQueue);
System.out.println(referent.get());// null

System.gc();
System.runFinalization();

System.out.println(refQueue.poll() == referent); //true
}

주의해 야 할 것 은 인용 회수 에 있어 서 가상 인용 과 유사 한 강 한 인용 은 메모리 상황 에 따라 자동 으로 대상 을 회수 하지 않 으 며,Client 는 Heap 메모리 가 이상 하지 않도록 스스로 처리 해 야 한 다 는 것 이다.
가상 인용 은 다음 과 같은 특징 이 있 습 니 다.
가상 인용 은 get()방법 으로 대상 의 강 한 인용 을 얻어 대상 에 접근 할 수 없습니다.
가상 인용 이 가리 키 는 대상 은 시스템 메모리 에서 회수 되 기 전에 가상 인용 자 체 는 Reference Queue 대상 에 넣 어 대상 쓰레기 수 거 를 추적 합 니 다.
가상 인용 은 메모리 상황 에 따라 대상 을 자동 으로 회수 하지 않 습 니 다.
또한 주의해 야 할 것 은 사실 SoftReference,WeakReference,PhantomReference 의 구조 함수 가 모두 Reference Queue 대상 을 받 아들 일 수 있다 는 것 이다.SoftReference 와 WeakReference 가 비 워 지 는 동시에 자바 쓰레기 회수 기 가 가리 키 는 대상 을 회수 하려 고 할 때 대상 의 finalize()방법 을 호출 하기 전에 이 Reference Queue 대상 에 자체 적 으로 가입 합 니 다.이때 Reference Queue 의 poll()방법 을 통 해 찾 을 수 있 습 니 다.Phantom Reference 는 자바 쓰레기 수 거 기 가 가리 키 는 대상 을 진정 으로 회수 할 때 만 이 Reference Queue 대상 에 추가 하여 대상 의 소각 상황 을 추적 할 수 있 습 니 다.
네 가지 인용 유형의 표현 과 쓰레기 회수 기 에서 메모리 정 리 를 할 때의 표현 을 살 펴 보 자.
소프트 참조(SoftReference),참조 형식 은 메모리 가 만부 하 에 가 깝 거나 대상 이 SoftReference.get()방법 으로 호출 된 지 얼마 되 지 않 으 면 쓰레기 수 거 기 는 이 대상 을 청소 합 니 다.실행 대상 의 finalize 방법 전에 소프트 참조 대상 을 Reference Queue 에 추가 합 니 다.
약 인용(Weak Reference),인용 유형 은 시스템 쓰레기 수 거 기 를 회수 하기 시작 하면 즉시 이 대상 의 인용 을 회수 하 는 것 으로 나 타 났 습 니 다.소프트 인용 과 마찬가지 로 약 인용 도 실행 대상 의 finalize 방법 전에 약 인용 대상 을 Reference Queue 에 추가 합 니 다.
강 한 인용(Final Reference)은 가장 자주 사용 되 는 인용 형식 입 니 다.JVM 시스템 은 Finalizer 를 사용 하여 모든 강 한 인용 대상 을 관리 하고 청소 할 때 Reference Queue 를 추가 하 며 대상 의 finalize()방법 을 하나씩 호출 합 니 다.
가상 인용(Phantom Reference)은 가장 허 황 된 인용 형식 입 니 다.어디서 든 허 용 된 인용 대상 을 되 돌 릴 수 없습니다.허 용 된 인용 은 시스템 쓰레기 수 거 기 를 시작 할 때 finalize()방법 을 직접 호출 하지만 즉시 회수 대기 열 에 추가 하지 않 습 니 다.실제 대상 이 GC 에 의 해 제 거 될 때 만,Reference 대기 열 에 넣 을 수 있 습 니 다.
시스템 쓰레기 수 거 를 여러 번 실행 한 후 IBM JVM 은 소프트 인용 을 회수 대기 열 에 추가 하고 finalize 방법 을 실행 합 니 다.또 시스템 쓰레기 수 거 를 여러 차례 거 쳐 도 허위 인용 은 대열 에 들 어가 지 않 았 다.IBM JVM 의 작은 버그 가 있 는 지 모 르 겠 습 니 다.
SoftReference 에서 Oracle JVM 의 표현 은 규범 을 만족 시 키 고 메모리 가 부족 할 때 만 회수 합 니 다.한편,IBM JVM 의 전략 은 더욱 적 극 적 이 고 메모리 가 충분 한 상황 에서 도 회수 되 었 으 므 로 주의해 야 한다.
Phantom Reference 에서 Oracle JVM 의 표현 은 규범 을 만족 시 키 고 finalize 를 실행 한 후 몇 번 GC 가 Queue 에 추가 되 었 습 니 다.반면 IBM JVM 은 Queue 에 추가 되 지 않 아 사순환 을 일 으 켰 다.따라서 PhantomReference 를 사용 할 때 유사 한 상황 이 발생 했 을 때 서로 다른 JVM 을 사 용 했 기 때 문인 지 를 고려 할 수 있다.

좋은 웹페이지 즐겨찾기