본문 바로가기
Language/Java

[Java] 참조

by y.j 2022. 6. 5.
728x90

참조란?

참조란 객체나 변수가 메모리를 생성하지 않고 기존에 존재하는 메모리에 접근하는 것이다.

참조의 종류

강한 참조(String Reference)

Object o = new Object();

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

  • new로 생성된 객체, 네이티브 피어, Queue / Stack처럼 스스로 메모리를 관리하는 객체 등...

GC의 대상이 되도록 한다.

o = null;

 

소프트 참조(Weak Reference)

MyClass ref = new MyClass();      

SoftReference<MyClass> softRef = new SoftReference<MyClass>(ref); 

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

  • 대상 객체를 참조하는 경우가 SoftReference 객체만 존재하는 경우, Heap영역 메모리가 부족한 경우 등...
// 이 시점에 GC의 실행 대상이 가능 
ref = null;

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

 

 

약한 참조(Weak Reference)

MyClass ref = new MyClass();      

WeakReference<MyClass> weakRef = new WeakReference<MyClass>(ref); 

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

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

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

 

[참고]

https://lion-king.tistory.com/entry/Java-%EC%B0%B8%EC%A1%B0-%EC%9C%A0%ED%98%95-Strong-Reference-Soft-Reference-Weak-Reference-Phantom-References

https://ktko.tistory.com/entry/%EC%9E%90%EB%B0%94-%EA%B0%95%ED%95%9C%EC%B0%B8%EC%A1%B0Strong-Reference%EC%99%80-%EC%95%BD%ED%95%9C%EC%B0%B8%EC%A1%B0Weak-Reference

728x90

댓글