[Java] GC & Reference

YounDitt·2020년 9월 22일
0

Java, JVM, 메모리

목록 보기
1/3

GC와 객체 참조

참조에 따른 GC의 동작을 학습한다.

📌GC

1. 가비지(Grabage)

  • 가비지는 더이상 사용하지 않는 메모리를 말한다.
    = 객체나 배열을 가리키는 참조(레퍼런스)가 하나도 없음.

2. 가비지(Garbage)의 발생

String str1 = new String("Hello");
String str2 = new String("Android");
String str3 = new String("Welcome");
String str4 = null;

str1 = null; // 1. "Hello"는 가비지가 되었다.
str4 = str3;
str3 = null; // 2. "Welcome"은 str4가 참조하고 있기 때문에 가비지가 되지 않았다.

3. 가비지 컬렉션(Garbage Collection)이란?

  • 가비지를 회수하여 사용할 수 있는 메모리 공간을 늘리는 작업을 가비지 컬렉션 이라고 한다. 그리고 이러한 일을 수행하는 것을 가비지 컬렉터라고 한다.

4. 가비지 판단 기준

* reachability를 구분한다.

  1. 힙 내의 다른 객체의 의한 참조
  2. Java 스택, 즉 Java 메서드 실행 시에 사용하는 지역 변수와 파라미터들에 의한 참조
  3. 네이티브 스택, 즉 JNI(Java Native Interface)에 의해 생성된 객체에 대한 참조
  4. 메서드 영역의 정적 변수에 의한 참조

    (그림 : 참고 : Naver D2 , Oracle HotSpot VM기준)
    • 1번을 제외한 나머지 3개가 Root Set으로 Reachability를 판가름하는 기준이 된다.
  • 객체에 유효한 참조가 있다면 reachable 로 구분한다.
  • 객체에 유효한 참조가 없다면 Unreachable로 구분하고 수거한다.
  • 하나의 객체가 다른 여러객체를 참조하는 등 유효한 참조가 있는지 파악하려면 항상 유효한 가장 처음의 참조가 있어야 한다.(객체 참조의 Root Set)
  • Root Set이 참조하고 있는 연결객체 모두는 Reachable이다.(참조사슬)
    • 그림 내 파란 선의 객체들
  • Root Set이 참조 당하기만 하거나, 아예 참조가 없는 객체는 Unreachable이다.
    • 그림 내 빨간 선의 객체들

그림 내의 참조는 모두 java.lang.ref 패키지를 사용하지 않은 일반적인 참조이며, Strong reference라 한다.

5. 수행방법


1. 새롭게 생성되면 Young의 Eden영역에 존재한다.
2. Eden이 가득차면 MinorGC가 발생하며 살아남은 객체(Reachable Objec)들은 Survival 0 으로 이동한다.
3. 기존 Survival 0에 존재하던 Reachable Object들은 Survival 1 로 이동한다.
4. Sruvival 1이 가득 차게 되면 Old영역으로 복사된다.(Old는 더 크다 = GC 적게발생)
5. Old영역에서는 MajorGC가 발생한다.

즉, young은 주기적으로 청소하고, 상대적으로 오랜기간 사용되는 Object들은 Old에서 관리한다.

  • Young은 사이즈가 작고, GC가 전체영역을 처리하는 것보다 시간이 덜 걸린다.
  • Young 영역을 한번에 모두 비우기 때문에 연속된 여유공간이 만들어진다.(메모리파편화를 방지할 수 있다.)

📌 참조 유형

참조유형에 따라 GC 실행 대상여부, 시점이 달라진다.

1. Strong Reference

  • new 연산자를 이용하여 객체를 생성한다.
MyObject obj = new MyObject();

2. Soft Reference

  • 해당 객체를 SoftReference 객체만 참조하고 있을 경우
    && JVM 메모리가 부족한 경우 GC의 대상이 된다.

3. Weak Reference

  • 해당 객체를 WeakReference 객체만 참조하고 있을 경우 GC의 대상이 된다.
  • GC동작마다 회수된다.
  • LRU 캐시 구성 시 주로 사용된다.
WeakReference<Sample> wr = new WeakReference<Sample>(new Sample());
Sample ex = wr.get(); // 참조되었다.
ex = null; // weakly reachable 객체

weak reachable 객체에 대한 참조가 null이 되면 GC에 의해 회수된다.

4. Phantom Reference

  • GC대상객체를 처리하는 작업(finalize)이후에 GC알고리즘에 따라 메모리회수한다.

jdk 1.2이후부터 java.lang.ref 패키지(Reference Object)를 통해 GC의 컨트롤이 어느정도 가능해졌다.

참고 1
참고 2
참고 3
참고 4
참고 5

profile
Hello, Android

0개의 댓글