참조에 따른 GC의 동작을 학습한다.
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가 참조하고 있기 때문에 가비지가 되지 않았다.
- 1번을 제외한 나머지 3개가 Root Set으로 Reachability를 판가름하는 기준이 된다.
그림 내의 참조는 모두 java.lang.ref 패키지를 사용하지 않은 일반적인 참조이며, Strong reference라 한다.
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 실행 대상여부, 시점이 달라진다.
MyObject obj = new MyObject();
WeakReference<Sample> wr = new WeakReference<Sample>(new Sample());
Sample ex = wr.get(); // 참조되었다.
ex = null; // weakly reachable 객체
weak reachable 객체에 대한 참조가 null이 되면 GC에 의해 회수된다.
jdk 1.2이후부터 java.lang.ref 패키지(Reference Object)를 통해 GC의 컨트롤이 어느정도 가능해졌다.