WeakHashMap 가이드
1. 개관
이 글 에서 우 리 는 자바 util 가방 의 Weak HashMap 류 를 토론 할 것 이다.
Weak HashMap 이라는 데이터 구 조 를 이해 하기 위해 서 우 리 는 그것 을 사용 하여 간단 한 캐 시 기능 을 실현 할 것 입 니 다.그러나 이 캐 시 기능 은 이러한 데이터 구 조 를 이해 하 는 데 만 도움 이 된다 는 것 을 명심 하 십시오.스스로 캐 시 를 실현 하 는 것 은 종종 가치 가 있 는 것 이 아니다.
쉽게 말 하면 Weak HashMap 은 hashtable 을 바탕 으로 Map 인터페이스 에 대한 실현 이 고 key 는 Weak Reference 유형 입 니 다.
일상적인 사용 에서 Weak HashMap 의 entry key 가 더 이상 사용 되 지 않 을 때 이 entry 는 Weak HashMap 에서 제 거 됩 니 다. 즉, 그 key 를 가리 키 는 단독 인용 이 없다 는 뜻 입 니 다.GC 가 키 하 나 를 회수 할 때 이 키 가 있 는 entry 도 맵 에서 효율적으로 제 거 됩 니 다.그래서 이런 행 위 는 다른 맵 의 실현 과 는 조금 다르다.
2. 강 한 인용, 부 드 러 운 인용 과 약 한 인용
Weak HashMap 이 어떻게 작 동 하 는 지 이해 하기 위해 서 는 Weak Reference 라 는 종 류 를 알 아야 합 니 다. 이 종 류 는 Weak HashMap 에서 key 의 기본 구조 입 니 다.JAVA 에 서 는 세 가지 주요 유형의 인용 이 있 는데, 아래 소절 에서 자세히 설명 한다.
2.1 강 인용
강 한 인용 은 우리 일상 프로 그래 밍 에서 가장 자주 사용 하 는 인용 유형 입 니 다.
Integer prime = 1;
prime 는 값 이 1 인 대상 의 강 한 인용 을 가지 고 있 습 니 다.어떤 대상 이 든 강 한 인용 이 그것 을 가리 키 면 GC 조건 을 만족 시 키 지 못 한다.
2.2 소프트 인용
쉽게 말 하면 하나의 대상 이 JVM 이 메모리 가 필요 할 때 까지 부 드 러 운 인용 이 가리 키 면 GC 에 의 해 지 정 됩 니 다.
다음은 자바 에서 소프트 참조 코드 세 션 을 만 듭 니 다:
Integer prime = 1;
SoftReference soft = new SoftReference(prime);
prime = null;
prime 는 대상 을 가리 키 는 강 한 인용 이다.
다음은 prime 포장 을 부 드 러 운 인용 에 넣 습 니 다.그리고 강 한 인용 할당 값 을 null 로 합 니 다. prime 대상 은 현재 GC 조건 을 만족 시 키 지만 JVM 이 메모리 가 필요 할 때 만 회수 합 니 다.
2.3 약 인용
약 한 인용 이 가지 고 있 는 대상 만 GC 에 우호 적 입 니 다 (쉽게 수집 된다 는 뜻).이 경우 해당 대상 의 GC 에 대해 서 는 JVM 이 메모리 가 필요 할 때 까지 발생 시기 가 지연 되 지 않 는 다.
다음은 약 한 인용 예 입 니 다.
Integer prime = 1;
WeakReference weak = new WeakReference<>(prime);
prime = null;
prime 가 null 로 할당 되 었 을 때 prime 대상 은 다음 GC 주기 에 회 수 됩 니 다. 강 한 참조 가 없 기 때 문 입 니 다.약 인용 은 Weak HashMap 에서 key 의 기본 형식 으로 사 용 됩 니 다.
3. Weak HashMap 을 사용 하여 효율 적 인 메모리 캐 시 기능 구현
캐 시 에서, 우 리 는 비교적 큰 그림 대상 을 value 로 하고, 그림 이름 을 key 로 해 야 한다.다음 에 우 리 는 이 문 제 를 위해 적당 한 맵 을 선택 하여 실현 한다.
HashMap 을 간단하게 사용 하 는 것 은 좋 은 선택 이 아니다.value 대상 이 큰 메모리 공간 을 차지 할 수 있 기 때문이다.더 중요 한 것 은 이들 대상 이 다 시 는 사용 되 지 않 더 라 도 GC 에 회수 되 지 않 는 다 는 점 이다.
이상 적 인 상황 에서 우 리 는 이러한 맵 의 실현 을 원한 다. GC 가 재 활용 하지 않 는 대상 을 자동 으로 삭제 하도록 허용 한다.응용 프로그램의 큰 그림 대상 키 가 더 이상 사용 되 지 않 을 때 해당 하 는 entry 는 메모리 에서 삭 제 됩 니 다.
다행히 Weak HashMap 은 이런 특성 을 갖 추고 있다.다음은 다음 과 같다.
WeakHashMap map = new WeakHashMap<>();
BigImage bigImage = new BigImage("image_id");
UniqueImageName imageName = new UniqueImageName("name_of_big_image");
map.put(imageName, bigImage);
assertTrue(map.containsKey(imageName));
imageName = null;
System.gc();
await().atMost(10, TimeUnit.SECONDS).until(map::isEmpty);
빅 이미지 대상 을 저장 하기 위해 Weak HashMap 대상 을 만 듭 니 다.BigImage 를 값 으로 하고, imageName 대상 을 key 로 합 니 다.imageName 은 * * WeakReference * * 형식 으로 존재 합 니 다.
다음은 imageName 을 null 로 설정 하면 bigImage 대상 을 가리 키 는 인용 이 없습니다.Weak Reference 의 기본 동작 은 다음 GC 에서 entry 를 회수 하기 때문에 다음 GC 과정 에서 이 entry 는 삭 제 됩 니 다.
System. gc () 를 호출 하여 JVM 이 GC 를 실행 하도록 강제 합 니 다. GC 이후 WeakHashMap 이 비어 있 습 니 다.
WeakHashMap map = new WeakHashMap<>();
BigImage bigImageFirst = new BigImage("foo");
UniqueImageName imageNameFirst = new UniqueImageName("name_of_big_image");
BigImage bigImageSecond = new BigImage("foo_2");
UniqueImageName imageNameSecond = new UniqueImageName("name_of_big_image_2");
map.put(imageNameFirst, bigImageFirst);
map.put(imageNameSecond, bigImageSecond);
assertTrue(map.containsKey(imageNameFirst));
assertTrue(map.containsKey(imageNameSecond));
imageNameFirst = null;
System.gc();
await().atMost(10, TimeUnit.SECONDS)
.until(() -> map.size() == 1);
await().atMost(10, TimeUnit.SECONDS)
.until(() -> map.containsKey(imageNameSecond));
imageNameFirst 참조 만 null 로 설정 되 었 습 니 다.이미지 네 임 세 컨 드 는 변 하지 않 았 습 니 다. GC 이후 맵 은 하나의 entry - --- - image 네 임 세 컨 드 만 가지 고 있 을 것 입 니 다.
4. 총화
이 글 에서 우 리 는 JAVA 중점 인용 유형 을 배 웠 고 Weak HashMap 이 어떻게 작 동 하 는 지 완전히 이해 했다.우 리 는 * * * Weak HashMap * * * 를 이용 하여 간단 한 캐 시 를 만 들 었 고 그 가 기대 하 는 작업 을 할 수 있 는 지 테스트 했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.