Java Garbage Collection
Garbage Collection으로 인하여 프로그래머가 직접 Memory를 건들일은 없게 되었습니다. 그러나 명시적 Memory 해제보다 느리며 GC가 발생하는 순건 Suspend Time으로 인하여 다양한 문제가 발생하게 됩니다. Root Set과 Garbage Garbage 대상을 결정하는데에는 아래와 같은 구조를 기준으로 합니다. Local variable, Operand Stact등에서 해당 객체를 참조하고 있으면, Reachable으로 판단. 아직 메모리에 남아있으며, Native Method 영역으로 넘겨진 Object의 참조가 JNI 형태로 남아있으면 Reachable 메서드 영역에 로딩된 클래스 중 Constant pool에 있는 Reference 정보를 토대로 쓰레드 에서 직접 참조하진 않지만 constance pool을 통해 간접 link를 하고있는 객체는 Reachable 이라고 한다. Garbage Collection의 과정을 거치면 위의 Unreachable 객체를 제거하게 된다. 메모리 상에서 해당 객체를 지우면 당연히 단편화(Fragmentation)이 발생하게 되고 이를 위해 Compaction 알고리즘을 사용해야 한다. Hotspot JVM의 Garbage Collection GC 메커니즘은 두가지를 경험적 가설로 두고 있다. 대부분의 객체는 생성후 바로 Garbage가 된다. 오래된 객체가 새로운 객체를 참조할 일은 드물다. 첫번째 가설로 인하여 신생 객체들은 단편화를 자주 만들기에 eden 영역에 모아놓은 것이다. 두번째 가설의 경우 오래된 객체가 새로운 객체를 참조하는 경우가 발생할 경우 문제가 되는데, 그를 해결하기 위한 장치로 Card Table을 도입 하였다. Card Table Card Table Old Object가 Young Object를 참조하게 되면 dirty로 표기하여 해당 내용을 ...