본문 바로가기
프로그래밍언어

JAVA 참조 유형과 관련된 자료구조

by 흰색남자 2023. 4. 5.

Strong, Soft, Weak, Phantom 순으로 설명하며 관련된 WeakMap자료구조를 설명한다.

1. Strong reference ( 강한 참조 )란?

우리가 일반적으로 
User a = new User();
방식으로 선언하는 방식이 Strong reference이다.

a라는 변수가 참조하는 값이 존재하므로 GC대상이 되지 않는다.
GC 대상이 되는 경우.
1. 스택에서 사용이 다 끝난 프레임이 사라지고 그 안에 만들었던 변수는 GC 대상이 됨.
2. 위 예제에서 a = null; 을 호출하면 GC 대상이 됨.

 

2. Soft Reference ( 소프트 참조 )란?
User a = new User();
SoftReference<Object> obj = new SoftReference<>(a);
a = null;

SoftReference 객체가 a객체를 wrap하고 있으므로 soft 참조 객체임. 여기서는 a = null을 호출해도 GC이 아니며 JVM의 메모리가 부족해질 위험이 있으면 GC 대상이 됨. ( OOM 이 발생하기 전에 GC가 이루어짐 ) 
주로 캐시를 구현할 때 사용된다고 하는데 아직 보거나 사용해 본적은 없음.


3. Weak Reference ( 약한 참조 )란? 
다음 GC가 발생할 시점에 무조건 GC 대상이 되는 객체를 의미함.
톰캣 컨테이너의 ConcurrnetCache 클래스에서 WeakHashMap을 사용한다고 함.

즉 Weak ref랑 soft ref의 차이는 GC가 이루어지는 시점의 차이.

4. Phantom reference란?

Phantom reference는 Reference Queue와 같이 동작하며, 참조가 없어지고 null일 경우에 Queue에 들어감. 
여기서 중요한 것은 Queue를 직접 비워주어야만 OOM이 발생하지 않음. 만약 비워주지 않을 경우에는 Queue에 쓰레기 데이터가 차올라서 OOM이 발생하게 됨.


자원 정리의 목적으로 사용함// finalize보다 더 나은 방법이긴 하지만 더 좋은 방법이 있기에 사용하지 않는다. // try with resource를 사용 // 메모리에서 언제 사라지는지 파악이 가능함.

 

 

5. WeakHashMap이란?

WeakHashMap은 HashMap에 Weak Reference 개념을 더한 것이다.
만약 Map 안에 어떠한 <Key, Value>는 사용하고 어떤 <key, value>는 사용하지 않을 때, 사용하지 않는 <key, value>를 정리해주는 목적으로 사용한다. Key에 대한 객체가 더이상 사용하지 않거나 null일 경우에 GC 대상이 되고 그러므로 primitive 타입은 WeakHashMap에서 사용하지 않는다. 

Weak나 Soft로 객체를 없애는 것은 너무 애매해서 권장하지 않는다. 불필요한 경우에는 직접 없애주는 경우가 더 코드가 보기 편리하고 직관적이다. 그러므로 꼭! 사용해야할 경우에만 사용하자.