취미처럼

[JAVA] 참조 본문

JAVA/이론

[JAVA] 참조

sirius 2021. 3. 23. 10:28

강한 참조(Strong Reference)

일반적으로 new를 통해서 객체를 생성하게 되면 생기게 되는 참조

강한 참조를 통해 참조되고 있는 객체는 가비지 컬렉션의 대상에서 제외된다.

 

Soft Reference

강한 참조와는 다르게 GC에 의해 수거될 수도 있고, 수거되지 않을 수도 있다.

메모리에 충분한 여유가 있다면 GC가 수행되고 있다 하더라도 수거되지 않는다.

하지만 out of memory의 시점에 가깝다면 수거될 확률이 높다.

 

약한 참조(Weak Reference)

약한 참조는 GC가 발생하면 무조건 수거된다.

Weak Reference가 사라지는 시점이 GC의 실행 주기와 일치하며 이를 이용하여 짧은 주기에 자주 사용되는 객체를 캐시할 때 유용합니다.

 

 
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.List;
 
 
class BigData {
    private int[] array = new int[2500]; //10000byte, 10K
}
 
public class ReferenceTest {
    private List<WeakReference<BigData>> weakRefs = new LinkedList<>();
    private List<SoftReference<BigData>> softRefs = new LinkedList<>();
    private List<BigData> strongRefs = new LinkedList<>();
    
    
    public void weakReferenceTest() {
        try {
            for (int i = 0; true; i++) {
                weakRefs.add(new WeakReference<BigData>(new BigData()));
            }
        } catch (OutOfMemoryError ofm) { // weak일 경우 out of memory 발생 하지 않는다.
            System.out.println("out of memory!");
        }
    }
    
    public void softReferenceTest() {
        try {
            for (int i = 0; true; i++) {
                softRefs.add(new SoftReference<BigData>(new BigData()));
            }
        } catch (OutOfMemoryError ofm) { // weak일 경우 out of memory 발생 하지 않는다.
            System.out.println("out of memory!");
        }
    }
    
    
    public void strongReferenceTest() {
        try {
            for (int i = 0; true; i++) {
                strongRefs.add(new BigData());
            }
        } catch (OutOfMemoryError ofm) { // Strong일 경우 out of memory 발생
            System.out.println("out of memory!");
        }
    }
    
 
    public static void main(String[] args) {
        System.out.println("실행");
        
        ReferenceTest test = new ReferenceTest2();
        test.weakReferenceTest();
        //test.softReferenceTest();
        //test.strongReferenceTest();
        
        System.out.println("종료");
    }
}

 

'JAVA > 이론' 카테고리의 다른 글

[JAVA] 문자열 형 변환 비교(casting VS toString VS String.valueOf)  (0) 2021.03.23
[JAVA] 콜백  (0) 2021.03.23
[JAVA] boxing, unboxing  (0) 2021.03.23
[JAVA] Map 출력  (0) 2021.03.22
[JAVA] @SuppressWarnings  (0) 2021.03.22
Comments