안녕하세요. 개발자 Jindory입니다.
오늘은 Java의 Gabage Collection이란 무엇이고 어떻게 GC가 동작하는지에에 대해서 대해서 알아보고자 합니다.
# 글 작성 이유
불필요한 객체를 Gabage Collector가 제거하는데 어떤 프로세스로 메모리 정리를 하는지 이해하고자 이 글로 정리하게 되었습니다.
GC란 무엇인가?
GC란 Garbage Collection의 약자로 메모리들 중 필요없게 된 영역을 해제하는 기능입니다.
Java는 Runtime시 Heap 영역에 객체와 객체 변수, 배열등의 데이터가 할당되어 관리되는데, 이를 정리하지 않으면 메모리가 계속 쌓이게 되어 OutofMemory Exception이 발생하여 다운될 수 있습니다.
그리하여 Memory가 쌓이지 않도록 JVM에서 주기적으로 사용하지 않는 메모리를 정리하는데 이게 Garbage Collector의 역할입니다.
Garbage Collecting은 어떤 방식으로 이뤄질까요?
Garbage Collector는 Heap 영역에서 더이상 참조(사용)되지 않는 객체를 정리합니다.
사용하지 않는 객체를 정리하는 과정은 아래의 3가지 단계를 따릅니다.
- Marking : Garbage Collector는 사용하는 객체와 사용하지 않는 객체를 식별하기 위해서 marking을 합니다.
아래의 그림과 같이 사용하는 객체는 파란색으로 사용하지 않는 객체를 주황색으로 표시하여 식별함을 알 수 있습니다.
- Normal Deletion : 다음으로 참조되지 않은 객체들을 제거하고 참조하는 객체와 포인터를 여유 공간에 남겨둡니다.Memory Allocator는 새로운 객체가 할당될 수 있는 여유 공간 블록에 대한 참조를 보유합니다.
- Deletion with Compacting : 성능을 더욱 개선하려면, 참조된 객체들을 모아서 압축 할 수 있습니다. 참조된 객체를 함께 이동하면 새로운 객체의 할당이 훨씬 쉽고 빨라집니다.
GC가 처리하는 Heap 메모리 영역
Garbage Collector가 관리하는 Heap 영역은 크게 Young, Old, Permanent 영역으로 나눌 수 있습니다.
Young Generation은 다시 Eden과 S0 Survice Space,S1 Survive Space로 나눌 수 있습니다.
Young Generation은 새로운 객체가 할당되고, 객체가 나이를 먹는 곳입니다. Young Generation이 가득차면 Minor Garbage Collection이 발생합니다. Young Generation의 메모리가 가득차면 Garbage Collecting은 빨라질 수 있습니다.
몇몇의 살아남은 객체들은 나이가 들면 Old Generation으로 이동합니다.
모든 Minor Garbage Colletion은 "Stop and World" 이벤트 입니다. 이는 GC를 실행하는 Thread를 제외한 모든 Thread가 작업을 중단하는것을 의미합니다. Minor Garbage Collection은 항상 Stop the World 이벤트입니다.
Old Generation은 오래 살아남은 객체를 저장하는데 사용됩니다. 일반적으로 Young Generation 객체에 대한 임계값이 설정되어 있고 해당 임계값에 도달하면 Old Genration으로 이동합니다. Old Generation은 결국 수집되어야 합니다. 이 이벤트를 Major Garbage Collection이라고 합니다. Major Garbage Collection도 Stop the World 이벤트입니다. Mjor Collection은 모든 활성화된 객체를 포함하기 때문에 느리게 수행됩니다.
Permanent Generation은 응용 프로그램에서 사용되는 클래스와 메서드를 설명하기 위해 JVM에서 필요한 메타데이터를 포함합니다. Permanent Geration은 응용 프로그램에서 사용하는 클래스에 따라 실생히 JVM에 의해 채워집니다. JVM이 더 이상 필요하지 않은 클래스를 찾으면 클래스가 수집 될 수 있으며, 다른 클래스를 위해 공간이 필요할 수 있습니다. Permenet Generation은 Full Garbage Collection에 포합됩니다.
GC가 메모리를 관리하는 프로세스를 간단히 정리하면 아래와 같습니다.
1) 객체가 생성되면 Eden에 영역에 할당된다.
2) Eden 영역이 꽉차면 Survive0 영역 or Survive1으로 넘어간다.
3) 이 과정에서 특정 Age가 넘은 객체가 있으면 old 영역으로 메모리를 옮긴다.
Garbage Collection Process
- 새로운 객체가 생성되면 Eden 영역에 할당됩니다. 2개의 Survivor 영역은 모두 빈 상태로 시작합니다.
- Eden 영역이 객체로 모두 차면, Minor GC가 시작됩니다.
- 참조된 객체는 S0 Survivor space로 이동하고 참조되지 않은 객체들은 삭제됩니다.
- 다음 Minor GC(Eden 영역이 메모리로 가득찬 상태)에 위와 동일한 과정이 이뤄집니다. 단 S0에 있는 메모리를 S1으로 옮기고 eden에서 참조된 객체도 S1 영역으로 옮깁니다. 그리고 Eden영역과 S0 영역은 모두 비어있는 상태로 clear됩니다. 이때 S1 영역에 있는 객체들이 서로 다른 age를 가지고 있다는 사실을 기억해야합니다.
- 또 다음 Minor GC가 시작하면 이번에는 Eden 영역의 참조된 메모리와 S1의 참조된 메모리를 S0로 이동시킵니다.
- 2번 ~ 5번의 과정을 반복하다가 특정 객체의 age가 임계치를 넘으면 해당 객체는 Old 영역으로 이동됩니다. 이 과정을 Major GC라고 합니다.
- Minor GC가 계속 진행됨에 따라 참조된 객체들은 계속해서 Old generation으로 이동합니다.
- 이러한 일련와 과정을 거치면서, 사용하지 않는 객체를 제거하고 사용한 객체는 Minor GC와 Major GC를 번갈아 가며 공간을 정리하고 압축하는 과정을 반복합니다.
이렇게 Java의 Gabage Collection이란 무엇이고 어떻게 GC가 동작하는지에 대해서 알아봤습니다.
혹시라도 정정할 내용이나 추가적으로 필요하신 정보가 있다면 댓글 남겨주시면 감사하겠습니다.
오늘도 Jindory 블로그에 방문해주셔서 감사합니다.
[ 참조 ]
https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html#t1
'개발 > Java' 카테고리의 다른 글
[Java] Generic의 컴파일 타임에 일어나는 Type Erasure (0) | 2024.01.09 |
---|---|
[Java] ArrayList 길이가 가변적으로 확장되는 방식(JDK 별) (2) | 2024.01.01 |
[Java] Java에서 Thread Unsafe한 상황 이해하기 (0) | 2023.12.15 |
[Java] Mutable Object와 Immutable Object (2) | 2023.12.15 |
[JAVA] static에 관하여 (0) | 2023.12.13 |