Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- http
- Filter
- request
- 트랜잭션
- 스프링
- 인터셉터
- Spring Security
- 스프링부트
- SQL
- Redis
- mybatis
- 디자인패턴
- 관점지향프로그래밍
- response
- aspect
- java
- MYSQL
- OOP
- 객체지향프로그래밍
- Spring
- proxy pattern
- Interceptor
- RestControllerAdvice
- 자바
- network
- spring boot
- git
- 스프링 시큐리티
- aop
- exception
Archives
- Today
- Total
장쫄깃 기술블로그
[Java] 참조 유형 (Strong Reference / Soft Reference / Weak Reference / Phantom Reference) 본문
Programming Language/Java
[Java] 참조 유형 (Strong Reference / Soft Reference / Weak Reference / Phantom Reference)
장쫄깃 2022. 6. 6. 01:00728x90
들어가며
Java Strong Reference / Soft Reference / Weak Reference / Phantom Reference
Java의 참조 유형에는 크게 4가지가 있다.
참조 유형에 따라 GC 실행 대상 여부, 시점이 달라진다.
- Strong Reference (강한 참조)
- Soft Reference (소프트 참조)
- Weak Reference (약한 참조)
- Phantom Reference (팬텀 참조)
아래로 갈수록 GC의 대상이 되는 경우와 실행되는 시점이 앞당겨진다.
1. Strong References (강한 참조)
Java의 기본 참조 유형이다.
MyClass obj = new MyClass();
obj 변수가 참조를 가지고 있는 한, MyClass 객체는 GC의 대상이 되지 않는다.
2. Soft Reference (소프트 참조)
MyClass ref = new MyClass();
SoftReference<MyClass> softRef = new SoftReference<MyClass>(ref);
// 이 시점에 GC의 실행 대상이 가능
ref = null;
// JVM의 메모리가 부족하지 않아 GC 실행 대상이 되지 않은 경우
// null이 반환되지 않고 기존 객체가 반환됨
ref = softRef.get();
대상 객체를 참조하는 경우가 SoftReference 객체만 존재하는 경우 GC의 대상이 된다.
단, JVM 메모리가 부족한 경우에만 힙 영역에서 제거되고 메모리가 부족하지 않다면 굳이 제거하지 않는다.
3. Weak Reference (약한 참조)
MyClass ref = new MyClass();
WeakReference<MyClass> weakRef = new WeakReference<MyClass>(ref);
// 이 시점에 GC의 실행 대상이 가능
ref = null;
// 다음 GC 실행시 무조건 힙 메모리에서 제거
// 제거된 경우 null 반환
ref = softRef.get();
대상 객체를 참조하는 경우가 WeakReference 객체만 존재하는 경우 GC의 대상이 된다.
다음 GC 실행 시 무조건 힙 메모리에서 제거된다.
(톰캣 컨테이너의 ConcurrentCache Class에서 WeakHashMap을 사용 중)
4. Phantom Reference (팬텀 참조)
@Test
public void test() {
MyClass ref = new MyClass();
ReferenceQueue<MyClass> refQueue = new ReferenceQueue<MyClass>();
PhantomReference<MyClass> phantomRef = null;
// 팬텀 참조는 아래처럼만 생성이 가능하다
phantomRef = new PhantomReference<MyClass>(ref,refQueue);
ref = null;
System.gc();
// 예상 : true
// 실제 테스트: false
System.out.println(phantomRef.isEnqueued());
System.out.println(phantomRef.get()); // null
}
생성자에서 무조건 ReferenceQueue를 받는다. (GC가 실행되기 전에 (finalize() 호출 후))
PhantomReference는 객체 내부의 참조를 null로 설정하지 않고 참조된 객체를 phantomly reachable 객체로 만든 이후에 ReferenceQueue에 enqueue 된다.
잘 쓰이지 않는다.
참고
728x90
'Programming Language > Java' 카테고리의 다른 글
[Java] String Constant Pool (0) | 2022.06.12 |
---|---|
[Java] Java Virtual Machine(JVM) 이란? (0) | 2022.06.12 |
[Java] GC(Garbage Collection) 이해하기 (0) | 2022.06.06 |
[Java] 객체 지향 설계 5원칙 - SOLID (0) | 2022.04.20 |
[Java] 코드 실행 시간 측정하기 (0) | 2022.04.19 |