# 개요
Gabage Collection, GC란??
CS를 공부할때 한번쯤 언어적으로 접근할 필요가 있다고 생각한다.
Gabage(쓰레기) Collector(수집가)라는 말의 뜻을 갖고 있다.
그러면 컴퓨터, 즉, 프로세스가 구동중에 Gabage(쓰레기)는 무엇인지 알아보아야한다.
Once upon a time~ 과거 java, python 등등 이러한 언어가 나오기 이전으로 돌아가보자
과거 프로그래밍 언어들은 프로그래머가 동적메모리를 할당부터 해제까지 모두 수동으로 해줘야했다.
특히 우리가 알고 있는 C언어도 그랬다. 항상 개발자들은 메모리를 할당하고 해제하지 않거나 해제한 메모리를 다시 해제 하는 등... 휴먼에러를 많이 발생시켰다.
개발자는 휴먼에러를 최소화해야겠다. 명령대로만 알아듣는 컴퓨터를 위해선 인간이 실수를 하면 안되니깐.... 컴퓨터는 거짓말하지 않기 때문!!
저런 휴먼에러는 메모리 누수를 발생시켰다. 즉 동적으로 할당한 메모리 영역 중 더이상 사용하지 않는 메모리 영역을 방치시켰던 것이다. 그래야 "개발자는 개발에만 집중을 할 수 있다." 기존코드 메모리 누수 잡다가 끝날지도....
이를 해결하기 위해서는 GC를 사용했고 GC는 알아서 자동으로 찾아내어 사용하지 않는 객체를 파괴한다.
# Detail
GC를 알기전에 'stop-the-world'에 대해서 알아야한다.
'stop-the-world(STP)'는 세계를 멈춰!! 라는 말이다. JAVA에서 세계 즉, 환경은 JVM을 이야기한다.
GC를 하기 위해서 JAVA의 환경인 JVM을 멈춰야한다.
왜 멈출까?? 왜 GC를 해야할때 멈춰야만하지?? 라는 생각이 들꺼다.
이유를 찾아본 바로는,
- 메모리 일관성 유지: 어플리케이션 스레드가 계속 실행되면 파괴하려는 객체를 참조가 하거나 수정할 수 있기 때문에, 메모리 상태가 일관성을 유지할려면 정지가 필요하다.
- 안전한 객체 회수: 어찌됫던 계속 실행되면 객체가 참조 되기 때문에 정확한 판단을 할 수가 없다.
결국에 응용프로그램이 실행될때는 메모리가 참조 될 수 있기때문에 JVM에서 일시적으로 동작을 멈추고 GC를 실행하게 된다. 뒤죽박죽인 인형뽑기에서 인형뽑는것도 어려운데 움직이는 인형은 난이도가 배가 된다.
결국 GC는 STW를 줄이는 방향으로 고도화 되며 이것을 우리는 GC 튜닝이라고 부른다!
그러면 GC는 메모리 영역중에서 어디서 동작을 할까?
자바의 메모리 영역은 총 5가지 class, stack, heap, native method, PC 로 나뉘는데
GC는 heap 영역에서 동작을 한다.
heap 영역에 있는 객체들을 선택하기 위해서 GC도 판단기준를 갖고 있습니다. 쓰레기인지 아닌지 분리를 해야한다.
일상생활에서 쓰레기의 정의는 어떤걸까?? 제가 생각한 쓰레기의 정의는 쓸모 있음/ 쓸모 없음 이다.
# GC 선택 방법
GC는 도달능력( Reachable / Unreachable )으로 판단기준을 삼게된다.
Unreachable 한 객체는 root set과 연결되어있지 않는 heap영역에 존재하는 객체를 의미한다.
또한, root set과 연결되어있지만 이 객체를 참조는 Reachable 객체가 없다면 이 객체는 Unreachable 객체이다.
이게 기본적인 GC의 동작 원리이고 각각 어떤 reference를 기준으로 삼느냐에 따라서 달라지게 된다. 아래로 갈수록 GC의 대상이된다고 생각하면 된다.
- Strong Reference
- Soft Reference
- Weak Reference
- Phantom Reference
# GC 청소 방식
위와 같은 참조 유형들로 Reachable 객체가 없다면 이 객체는 Unreachable 객체를 판단할지 나누었다.
Unreachable객체를 청소를 해야하는데 Mark & Sweep 방식을 따라간다.
- Unreachable 객체를 Mark한다.
- Unreachable 객체를 Sweep한다.
- Reachable 객체를 Compaction한다. (GC 종류에 따라 하지 않을 수도 있음)
힙구조를 생각하면 좋다. 간선으로 연결되어있어 연결이 이루어지지 않는 엣지들을 찾으면 된다.
(다 알고리즘이랑 연결되어있다...!)
2023.11.20 - [Computer Science/Data Structure] - [Data Structure] 비선형 - 힙(Heap)
이후에는 GC동작원리와 GC종류에 대해서 알아보겠다.
'Language > Java' 카테고리의 다른 글
[JAVA] 컴파일 과정 (0) | 2024.04.09 |
---|---|
[JAVA] Gabage Collection (2)🗑️ (0) | 2024.04.09 |
[JAVA] 상속 👨👩👧👦 (2) | 2023.09.12 |
[JAVA] JVM 메모리 구조 (0) | 2023.09.12 |
[JAVA] Thread 활용법 (0) | 2022.01.14 |