Weak Reference & Soft reference

2022. 12. 3. 15:07자바멘토링

자바의 Garbage Collector 는 더이상 참조되고 있지 않는 객체를 자도응로 수거하여 프로그래머가 직접 메모리를 

관리하지 않아도  되도록 해준다, 하지만 모든 경우에 대해 gc가 깨끗하게 메모리를 정리해주지는 않는다,

때로는 참조가 계속 남아 있는 경우가 있을 수 있고 이런 경우에 객체는 수거되지 않고 memory leak으로 이어질 수 있다, 이와 같이 참조를 부주의하게 사용하여 발생할 수 있는 memory leak 현성을 막기외해서는  객체에 대한 참조를 유연하게 다루어 필요하지 않은 객체들이 수거 될 수 있도록 해야 한다.

 

 JAVA의 참조 유형에는 4가지가 있다, 참조유형에 따라 GC실행 대상여부와, 시점이 달라진다.

 

Reachability #

Garbage collector는 reference root set으로 부터 참조를 통해 도달 가능한 객체들을 제외하고는 모두 garbage로 간주한다. 즉 garbage collector의 관점에서는 참조할 수 있는 객체(reachable)와 참조할 수 없는 객체(not reachable)로 나뉘게 된다. Reference object들을 이용하면 reachable한 객체에 대해서 참조에 대한 강약을 조절할 수 있다.
GC(Garbage collector)는 reference의 강약에 따라 도달 가능한 객체를 제외하고 모두 쓰레기로 간주합니다. GC의 관점에서는 객체를 참조가 가능한 객체와 참조할 수 없는 객체로 봅니다. 즉, 요 놈을 내가 다시 사용할 수 있냐, 없냐를 보고 없으면 쓰레기 통으로 넣어 버리는 것이죠. 
 Reference Object는 참조의 강약에 따라 Strong Reference, Soft Reference, Weak Reference, Phantom Reference(생략) 으로 나누고 순서대로 참조가 강합니다. 하나의 객체가 Strong과 Weak 참조가 있다면 그 객체는 Strong한 객체로 생각합니다. 
 Strong reference > Soft reference > Weak reference > Phantom reference
 

Strong Reference(강한 참조)

 Strong Reference는 new를 이용해 생성된 객체를 말합니다. 이 객체는 GC에서 무조건 제외되기 때문에 메모리 누수(Memory Leak)을 방지하기 위해서는 이 참조를 주의해서 보아야 합니다. 이 참조를 지워주지 않으면 GC에 의해 수거되지 않고 남아있기 때문에 메모리 누수를 유발할 수 있습니다.
import java.util.ArrayList;
import java.util.List;

public class StrongReferenceSample {
 private static List stack = new ArrayList();

 private static int position;

 public static void push(String str) {
  stack.add(str);
  position++;
 }

 public static String pop() {
  if (position > 0) {
   // stack.remove(position);
   return stack.get(position--);
  }
  return null;
 }
}

Soft Reference(소프트 참조)

SoftReference는 다음과 같이 객체에 Reference를 넘겨줌으로서 생성할 수 있습니다. SoftReference object = new SoftReference(new Object());  이 참조는 메모리가 충분하다면 GC에 의해서 수거되지 않고, 메모리에 여유가 없다면 GC에 의해 수거됩니다.

java에서 lang패키지에 클래스 사용하면 된다 .

MyClass ref = new MyClass();      

//Soft reference는 ''SoftReference''객체에 reference를 넘겨 주어 생성할 수 있다.
SoftReference<MyClass> softRef = new SoftReference<MyClass>(ref); 

// 이 시점에 GC의 실행 대상이 가능 
ref = null;

// JVM의 메모리가 부족하지 않아 GC 실행 대상이 되지 않은 경우
// null이 반환되지 않고 기존 객체가 반환됨
ref = softRef.get();
 

ref ->null을 대입해주면 ref객체에 대한 접근은 SoftReference인 softRef를 통해서만 가능하게된다.

객체는 SoftReference 클래스의 get() 메서드로 검색할 수 있습니다.

Weak Reference(약한 참조)

WeakReference는 SoftReference와 유사하지만 GC가 발생되기 전까지는 참조를 유지하고 GC가 발생하면 무조건 회수된다는 점에서 차이가 있습니다. 이는 유용하게 쓰일 수 있는데, 짧은 시간, 자주 쓰일 수 있는 객체를 이용할 때 유용하게 사용될 수 있습니다.
Student  mStudent  = new Student();      

WeakReference<Student> mWeak = new WeakReference<Student>(new Student("인수")); 

// 이 시점에 GC의 실행 대상이 가능 
mStudent = null;

// 다음 GC 실행시 무조건 힙 메모리에서 제거
// 제거된 경우 null 반환
Student mStudent = mWeak.get();

new()메소드로 생성해서 , wrapping한 객체이다.

이렇게 생성한 객체는 wrap한 mWeak객체에 get()메소드로 얻어올수 있다.

얻어온 mStudent 객체에 null을 대입해주면 Student 객체에 대한 접근은 WeakReference인 mWeak를

통해서만 가능하게 된다.

 

이렇게 weakReference에 의해서만 접근 할 수 있는상태가 됬을때, reahability가 약하다고 한다.

 

이상태가 되면, gc동작시에 WeakReference객체에 대한 참조를 null값으로 해주기 때문에 , gc에 의해서 메모리상에서 

정리되는 대상이 될수 있다.

 

 

'자바멘토링' 카테고리의 다른 글

파일디스크립터  (0) 2022.12.18
리플렉션  (0) 2022.12.15
Try - With - Resource  (0) 2022.12.04
추상클래스  (0) 2022.12.03
Static 이란?  (0) 2022.11.27