꾸준한 스터디
Published 2023. 1. 30. 19:15
Java의 참조 유형 Effective Java/키워드

Java의 참조 유형

Java에는 다양한 참조 유형이 있는데 참조 유형에 따라 가비지 컬렉터의 실행 대상 여부 및 시점이 달라진다. 

 

Strong Reference (강한 참조)

자바의 기본 참조 유형이다. 

Class class = new Class();
Integer i = 1;
String str = "str";
...

Strong Reference의 경우 참조를 가지고 있는 한 가비지 컬렉터의 대상이 되지 않는다. (가비지 컬렉터는 참조하고 있는 객체의 경우 대상에서 제외한다.)

 

Soft Reference (부드러운 참조)

Class class = new Class();
SoftReference<Class> sRef = new SoftReference<Class>(class);

class = null;

class = sRef.get();

대상 객체를 참조하는 경우가 SoftReference 객체만 존재하는 경우 GC의 대상이 된다. 

즉, 기본 참조인 'class' 객체가 null이 되는 순간 대상 객체(class)를 참조하는 경우는 sRef만 존재하게 되고 참조를 가지고 있지만 가비지 컬렉터의 대상이 된다.

 

단, JVM의 메모리가 부족한 경우에만 Heap 영역에서 제거되고 메모리가 부족하지 않다면 굳이 제거하지 않는다.

(class = sRef.get(); 을 실행 시 JVM의 메모리가 부족하지 않아 가비지 컬렉터의 대상이 되지 않은 경우 null이 아닌 기존 객체가 반환된다.)

 

Weak Reference (약한 참조)

Class class = new Class();
WeakReference<Class> wRef = new WeakReference<Class>(class); 

class = null;

class = wRef.get();

대상 객체를 참조하는 경우가 WeakReference 객체만 존재하는 경우 GC의 대상이 된다. (class = null;)

 

SoftReference와 같은 경우에 가비지 컬렉터의 대상이 되지만 다른 점이 존재한다.

SoftReference는 JVM의 메모리가 부족한 경우에만 Heap 영역에서 제거되지만 WeakReference의 경우 다음 가비지 컬렉터 실행 시 무조건 Heap 영역에서 제거된다. 

(class = wRef.get();을 실행 시 제거된 경우 null을 반환한다.)

 

profile

꾸준한 스터디

@StudyRecord

포스팅이 유익하셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!