Java 참조 유형 구체 적 해석

4327 단어 자바
JVM  쓰레기 수집 은 서로 다른 유형의 인용 에 대해 서로 다른 방법 이 있다.자바 대상 에 대해인용 만 존재 한다.그것 은 메모리 에 계속 존재 할 것 이다.이러한 대상,외부 JVM 의 메모리 가 점점 많아 진다 고 가정 합 니 다.JVM 이 OutOf Memory 오 류 를 던 졌 습 니 다.
쓰레기 수집 에 대한 세부 사항 은 JVM 제어 지만발송 자 는 여전히 어느 정도 에 쓰레기 회수 기와 상호작용 을 할 수 있 는데 그 목적 은 쓰레기 회수 기 가 응용 메모 리 를 잘 관리 하도록 돕 는 데 있다.이런 인 터 랙 션 방식 은 JDK 1.2 로 도 입 된 것 이다.  java.lang.ref 패키지.강 인용(strong reference)은 일반적인 자바 프로그램 에서 가장 많이 보 이 는 것 이 강 인용(strong reference)이다.Date date=newDate(),date  대상 의 강 한 인용 이다.
대상 의 강 한 인용 은 프로그램 에서 여기저기 전달 할 수 있다.같은 시기 에 여러 개의 인용 이 같은 대상 을 가리 키 는 경우 가 많다.강력 한 인용 이 존재 하여 대상 이 메모리 에서 생존 하 는 시간 을 제한 합 니 다.
대상 A 에 대상 B 의 강 한 인용 이 포함 되 어 있다 면.그렇다면 일반적인 상황 에서 대상 B  의 생존 시간 은 대상 A 보다 짧 지 않다.
대상 A 가 명시 적 으로 대상 B 의 인용 을 null 로 설정 하지 않 았 다 고 가정 합 니 다.  대상 A 가 쓰레기 수 거 된 후에 만.대상 B  더 이상 인용 이 가리 키 지 않 는 다.쓰레기 수 거 의 기 회 를 얻 을 수 있 습 니 다.소프트 인용  참조)소프트 인용(소프트  reference)강 한 인용 보다 강도 가 약 하 며,소프트 레 퍼 런 스 를 통 해 표시 합 니 다.
그것 의 작용 은 쓰레기 수 거 기 를 알려 주 는 것 이다.프로그램의 어떤 대상 이 그리 중요 하지 않 습 니까?메모리 가 부족 할 때 임시로 회수 할 수 있다.JVM 의 메모리 가 부족 할 때 쓰레기 수 거 기 는 그것 을 방출 합 니 다.  부 드 럽 게 인용 되 어 가리 키 는 대상 들이 대상 들 을 모두 방출 한 후에 메모리 가 부족 하 다 고 가정 해 야 OutOf Memory 오 류 를 던 질 수 있 습 니 다.소프트 인용 은 캐 시 를 만 드 는 데 적합 합 니 다.시스템 메모리 가 부족 할 때 캐 시 에 있 는 내용 을 풀 수 있 습 니 다.예 를 들 어 이미지 편집기 의 프로그램 을 고려 합 니 다.이 프로그램 은 그림 파일 의 모든 내용 을 메모리 에 읽 습 니 다.편리 하 게 처리 하 다.사용자 도 같은 시간 에 열 수 있 습 니 다.  여러 개의 서류.같은 때 열 린 파일 이 너무 많 으 면 메모리 가 부족 할 수 있 습 니 다.그림 파일 의 내용 을 가리 키 는 플 로 피 인용 을 사용한다 고 가정 하면 쓰레기 수 거 기 는 필요 할 때 이 메모 리 를 회수 할 수 있다.
import java.lang.ref.SoftReference;

public class ImageData {
	private String path;
	private SoftReference<byte[]> dataRef;

	public ImageData(String path) {
		this.path = path;
		dataRef = new SoftReference<byte[]>(new byte[0]);
	}

	private byte[] readImage() {
		return new byte[1024 * 1024]; //           
	}

	public byte[] getData() {
		byte[] dataArray = dataRef.get();
		if (dataArray == null || dataArray.length == 0) {
			dataArray = readImage();
			dataRef = new SoftReference<byte[]>(dataArray);
		}
		return dataArray;
	}
}

위의 프로그램 을 실행 할 때 사용 할 수 있 습 니 다.  -Xmx  파 라 메 터 는 JVM 이 사용 할 수 있 는 메모 리 를 제한 합 니 다.소프트 인용 이 가리 키 는 대상 이 회 수 될 수 있 기 때문이다.통과  get 방법 으로 소프트 인용 이 실제 가리 키 는 대상 을 가 져 올 때 항상 이 대상 이 살아 있 는 지 확인 해 야 합 니 다.
약 인용(약 참조)
약 한 인용(weak reference)은 강도 적 으로 부 드 러 운 인용 보다 약 하 며,클래스 Weak Reference 를 통 해  표시대상 을 인용 하 는 역할 을 하지만 그 대상 이 회수 되 는 것 을 막 지 는 않 는 다.강 한 인용 을 사용한다 고 가정 하면.이 인용 만 존재 합 니 다.그럼 인 용 된 대상 은 회수 할 수 없습니다.
약 한 인용 은 이 문제 가 없다.
쓰레기 수 거 기 를 실행 할 때 한 대상 의 모든 인용 이 약 한 인용 이 라 고 가정 하면 이 대상 은 회수 된다.
약 한 인용 작용 은 강 한 인용 이 가 져 온 대상 간 의 생존 시간 에서 의 결합 관 계 를 해결 하 는 데 있다.약 한 인용 에서 가장 흔히 볼 수 있 는 용 도 는 집합 류,특히 하 쉬 표 에 있다.
해시 표 의 인 터 페 이 스 는 어떤 자바 대상 이 든 키 로 사용 하 는 것 에 동의 한다.키 쌍 이 해시 표 에 들 어가 면해시 시계  대상 자체 에 이 키 와 값 대상 에 대한 인용 이 있 습 니 다.
이러한 인용 이 강 한 인용 이 라 고 가정 하면 해시 표 대상 자체 만 살아 남 고 그 안에 포 함 된 키 와 값 대상 은 회수 되 지 않 습 니 다.어떤 생존 을 가정 하 다  시간 이 매우 긴 해시 표 에 포 함 된 키 값 이 매우 많아 서 드디어 JVM 의 모든 메모 리 를 소모 할 수 있 습 니 다.이러한 상황 에 대한 해결 방법 은 약 한 인용 을 사용 하여 이 대상 을 인용 하 는 것 이다.그러면 해시 표 의 키 와 값 대상 은 모두 쓰레기 로 회수 할 수 있다.
자바 에 서 는 이러한 흔 한 수 요 를 만족 시 키 기 위해 Weak HashMap 을 제공 합 니 다.인용  reference)가상 인용 을 소개 하기 전에 자바 가 제공 하 는 대상 종료 메커니즘(finalization)을 소개 해 야 합 니 다.Object 클래스 에 finalize 방법 이 있 는데 그 디자인 의 취 지 는 한 대상 이 진정 으로 회수 되 기 전에 청 소 를 할 수 있 는 작업 을 하 는 것 입 니 다.자바 가 C++와 같은 분석 함수 와 같은 메커니즘 을 제공 하지 않 았 기 때문에 finalize 방법 을 통 해 이 루어 집 니 다.
문 제 는 쓰레기 수 거 기의 실행 시간 이 일정 하지 않 기 때문에 이런 청소 작업 의 실제 실행 시간 도 예측 할 수 없다 는 것 이다.인용  reference)문 제 를 해결 할 수 있 습 니 다.가상 인용 Phantom Reference 를 만 들 때 인용 대기 열 을 지정 해 야 합 니 다.대상 의 finalize 방법 이 호출 된 후에이 대상 의 가상 인용 은 대기 열 에 추 가 됩 니 다.
이 대기 열 안의 내용 을 검사 해 보면 대상 이 회수 할 준비 가 되 어 있 는 지 알 수 있다.
어떤 경우 에는프로그램 은 한 대상 의 도달 가능성 이 변화 할 때 통 지 를 받 아야 한다.예 를 들 어 어떤 대상 의 강 한 인용 은 이미 존재 하지 않 고 부 드 러 운 인용 이나 약 한 인용 만 남 았 다.
그러나 인용 자체 에 대해 약간의 처 리 를 해 야 한다.전형 적 인 광경 은 하 쉬 표 에 있다.인용 대상 은 Weak HashMap 의 키 대상 입 니 다.인 용 된 실제 대상 이 쓰레기 로 회수 되면이 키 값 을 해시 표 에서 삭제 해 야 합 니 다.인용 대기 열(Reference Queue)이 있 으 면 약 한 인용 대상 을 쉽게 가 져 와 표 에서 삭제 할 수 있 습 니 다.
앞 부 드 럽 고 약 한 인용 대상 이 대기 열 에 추가 되 었 습 니 다.실제 인용 대상 은 비 워 지고 주동 적 이다.
대기 열 poll/remove 를 참고 하여 이 방법 은 비 막힘 과 방식 으로 막 혀 각각 참조 대기 열 대상 을 얻 을 수 있 습 니 다.
참고:
JVM 깊이 이해
자바 심층 탐색

좋은 웹페이지 즐겨찾기