자바의 Reference
알아보기
자바의
WeakMap
을 이해하기 위해서는 자바의Reference
를 이해해야 한다.Reference
는WeakHashMap
을 이해하기 위한 선행 지식이다.
자바에서는 기본으로 지원하는 int
, long
, float
과 같은 primitive
타입이 아닌 클래스를 이용하여 변수를 구성하는 경우, Reference
라는 것을 이용하여 변수에 Heap
메모리 영역 내부 실제 값이 있는 주소를 연결시킨다.
보통 변수가 직접 값을 가지고 있는 것이 아니다. 변수는 메모리 주소만 가지고 있는 것이다.
Strong Reference (강한 참조)
Integer myNumber = 10;
- 우리가 가장 일반적으로 이용하는 그냥 변수 할당이다. 이를 강한 참조라고 한다.
myNumber
는 값이10
인Integer
객체를 참조한다.
Soft Reference (부드러운 참조)
@Test
public void softReference() {
Integer myNumber = 10;
SoftReference<Integer> softReference = new SoftReference<>(myNumber);
}
- 일반적인 변수 할당 후에 추가적으로,
SoftReference
라는 객체를 이용하여 레퍼런스 타입을 바꿔주었다. - 이제부터
myNumber
에null
이 들어간다면(myNumber = null
), JVM 에 의해 가비지 컬렉션 대상이 된다. - 다만, 메모리가 부족하지 않으면 굳이 가비지 컬렉션 하지 않을 수 있다.
- 주로 엄격하지 않은 캐시 라이브러리에서 사용된다.
Weak Reference (약한 참조)
@Test
public void weakReference() {
Integer myNumber = 10;
WeakReference<Integer> weakReference = new WeakReference<>(myNumber);
}
- 일반적인 변수 할당 후에 추가적으로,
WeakReference
라는 객체를 이용하여 레퍼런스 타입을 바꿔주었다. myNumber
에 이제null
이 들어간다면, JVM에 의해 가비지 컬렉션 대상이 된다.- 메모리가 부족하지 않아도 가비지 컬렉션이 이루어진다.
WeakHashMap
WeakHashMap
자료구조는 위에서 배웠던 자바의Reference
종류 중WeakReference
를 이용하는HashMap
이다.- 넣어놨던
key
의 값이null
이 된다면, 해당EntrySet
즉,key
와value
는 가비지 컬렉션 처리 되어버린다.
@Test
public void weakHashMapTest() {
WeakHashMap<Integer, String> map = new WeakHashMap<>();
Integer myNumber1 = 17000;
Integer myNumber2 = 18000;
map.put(myNumber1, "value1");
map.put(myNumber2, "value2");
myNumber1 = null;
System.gc();
map.entrySet().stream().forEach(System.out::println);
}
- 위 코드를 출력해보면
18000=value2
만 나올 것이다. myNumber1
은null
이 된 후System.gc()
가 가동되면 GC 된다.myNumber1
이 만일10
과 같은 작은 숫자라면, GC되지 않는다.- 자바 상수 풀(pool)이 해당 숫자를 여전히 참조하고 있기 때문이다.
자바 상수 풀이란 자주 쓰는 상수들을 저장해놓는 일종의 저장소이다. 이는 우리가 프로그래밍하는 중에 이용하는 변수 저장영역과는 분리되어 있기 때문에 상수 풀에 있는 값은 가비지 컬렉션되지 않는다.
반응형
'Java > 자바 API' 카테고리의 다른 글
자바 Objects.requireNonNull() 을 사용하는 이유 (1) | 2023.11.06 |
---|---|
자바 CountDownLatch란? (0) | 2022.01.03 |
자바 스트링 풀에 대해 쉽게 이해하기 (0) | 2021.12.25 |