2022. 12. 3. 15:07ㆍ자바멘토링
자바의 Garbage Collector 는 더이상 참조되고 있지 않는 객체를 자도응로 수거하여 프로그래머가 직접 메모리를
관리하지 않아도 되도록 해준다, 하지만 모든 경우에 대해 gc가 깨끗하게 메모리를 정리해주지는 않는다,
때로는 참조가 계속 남아 있는 경우가 있을 수 있고 이런 경우에 객체는 수거되지 않고 memory leak으로 이어질 수 있다, 이와 같이 참조를 부주의하게 사용하여 발생할 수 있는 memory leak 현성을 막기외해서는 객체에 대한 참조를 유연하게 다루어 필요하지 않은 객체들이 수거 될 수 있도록 해야 한다.
JAVA의 참조 유형에는 4가지가 있다, 참조유형에 따라 GC실행 대상여부와, 시점이 달라진다.
Reachability #
Strong reference > Soft reference > Weak reference > Phantom reference
Strong Reference(강한 참조)
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(소프트 참조)
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(약한 참조)
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 |