반응형
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
- mybatis
- resultMap
- 필드 주입
- 스프링 빈
- SQL
- springboot
- 생성자 주입
- 스프링 컨테이너
- java
- jdbc
- 스프링 부트 기본
- kafka
- 스프링
- spring
- JPA
- @Configuration
- 스프링 부트
- 싱글톤
- assertThat
- assertThrows
- 스프링부트
- thymeleaf
- 스프링 부트 입문
- DI
- sqld
- Effective Java
- DIP
- Javascript
- 스프링 프레임워크
- db
Archives
- Today
- Total
선 조치 후 분석
[Java] Java 참조 유형 종류 본문
728x90
반응형
SMALL
Java의 참조 유형에는 크게 4가지가 있다.
참조 유형에 따라서 GC 실행 대상 여부, 시점이 달라진다.
아래로 갈수록 CG의 대상이 되는 경우와 시점이 앞당겨진다.
- 강한 참조 (Strong Reference)
- 소프트 참조 (Soft Reference)
- 약한 참조 (Weak Reference)
- 팬텀 참조 (Phantom Reference)
1. 강한 참조 (Strong Reference)
- Java의 기본 참조 유형
A obj = new A();
obj 변수가 참조를 가지고 있는 한, A 객체는 GC의 대상이 되지 않는다.
2. 소프트 참조 (Soft Reference)
public static void main(String[] args) {
A obj = new A();
SoftReference<A> sftObj = new SoftReference<A>(obj);
// 이 시점에 GC의 실행 대상이 가능
obj = null;
// JVM의 메모리가 부족하지 않아 GC 실행 대상이 되지 않은경우
// null이 반환되지 않고 기존 객체가 반환된다.
obj = sftObj.get();
}
대상 객체를 참조하는 경우가 SoftReference 객체만 존재하는 경우 GC의 대상이 된다.
단, JVM 메모리가 부족한 경우에만 Heap 영역에서 제거되고 메모리가 부족하지 않다면 굳이 제거하지 않는다.
3. 약한 참조 (Weak Reference)
public static void main(String[] args) {
A obj = new A();
WeakReference<A> weakObj = new WeakReference<A>(obj);
// 이 시점에 GC의 실행 대상이 가능
obj = null;
//다음 GC 실행시 무조건 Heap 메모리에서 제거
// 제거된 경우 null 반환
obj = weakObj.get();
}
대상 객체를 참조하는 경우가 WeakReference 객체만 존재하는 경우 GC의 대상이 된다.
다음 GC 실행 시 무조건 Heap 메모리에서 제거된다.
4. 팬텀 참조 (Phantom Reference)
- 가장 GC 대상이 될 확률이 높은 유형
public static void main(String[] args) {
A obj = new A();
ReferenceQueue<A> refObj = new ReferenceQueue<A>();
PhantomReference<A> phantomObj = null;
// 팬텀 참조는 아래처럼만 생성이 가능
phantomObj = new PhantomReference<A>(obj,refObj);
obj = null;
System.gc();
System.out.println("GC 실행 전");
System.out.println(phantomObj.enqueue());
System.out.println(phantomObj.get());
System.gc();
System.out.println("GC 실행 후");
System.out.println(phantomObj.enqueue());
System.out.println(phantomObj.get());
}
생성자에서 무조건 ReferenceQueue를 받는다. GC가 실행되기 전에 finalize() 호출 후 메모리에서 정리된다고 한다.
내부적으로는 ReferenceQueue에서 유지하고 있지만 GC가 수행되면 ReferenceQueue에서도 제거되는 거 같다.
또한, Phantom은 다른 참조 유형과 다르게 get 메서드를 통해 접근하게 되면 항상 null이 반환된다.
즉 접근을 할 수 없다는 것을 의미한다.
Phantom Reference는 잘 사용하지 않고, 어려운 개념이라 GC 대상이 될 확률이 가장 높은 참조 유형이라고만
알고 넘어가자.
728x90
반응형
LIST
'Language > Java' 카테고리의 다른 글
[Java] final 키워드 정리 (fianl 변수, 메서드, 클래스) (0) | 2023.11.28 |
---|---|
[Java] static 키워드 개념과 사용법 (0) | 2023.11.28 |
[Java] String Constant Pool (String Pool) 개념 (1) | 2023.11.23 |
[Java] 상속 (Inheritance) vs 합성 (Composition) (0) | 2023.10.24 |
[Java] 얕은 복사 (Shallow Copy) vs 깊은 복사 (Deep Copy) (0) | 2023.10.19 |