[CS] Java 정리 - GC

JEONG KI MIN·2024년 11월 7일

CS - Java

목록 보기
3/3

위의 이미지는 JVM 내부의 힙 영역에 대한 이미지이다.

1. 가비지 컬렉터에 대해 설명해주세요.

Java 에서 제공하는 메모리 관리 기능으로, C언어나 C++ 과는 다르게 개발자가 직접 메모리에 관해 고민할 부분이 없다.
JVM이 사용하지 않는 메모리들을 확인해 가비지 컬렉터를 통해 가비지 컬렉션을 수행하여 메모리 누수를 방지 한다.

2. 힙 영역은 어떻게 이루어져 있나요?

JVM의 Runtime Data Area 에는 힙영역이 있는데 크게 Young Generation, Old Generation, permanent 영역으로 이루어져있다.

permanent 영역은 Java 8 이후로 Metadata space 로 바뀌었다고 한다

3. 각 영역에서 수행되는 GC에 대해 설명해주세요.

Young Generation 에서는 새로 생성된 객체가 할당되고, 대부분의 객체들은 보통 금방 Unreachable 상태로 가기 때문에 많은 객체가 Young Generation 영역에서 생성되고 금방 사라진다.
이 영역에서는 Minor GC 가 수행된다.

Old Generation 에는 Young Generation 에서 Reachable 상태로 살아남은 객체들이 저장된다. Young Generation 보다 크게 할당되고, 해당 영역에서 수행되는 GC는 Major GC 혹은 Full GC라고 부른다.

4. Reachable과 Unreachable 은 무엇인가요?

Java에서 새롭게 생성된 객체는 Heap 에 할당되고 Java는 객체들이 가비지인지 판단하기 위해 Reachable과 Unreachable 두개의 상태를 사용한다.
객체에 대한 유효한 접근이 있으면 Reachable, 유효한 접근이 없다면 Unreachable 이다.

5. Unreachable 객체라는 것을 어떻게 판단하죠?

JVM 내에서 Method 영역, Stack 영역 등에서 Heap 영역에 생성된 객체를 참조하는 변수를 사용한다.
이때 메서드 종료 등과 같은 이벤트 발생으로 인해 참조 변수가 사라진다면 Heap 영역에서 어떠한 참조도 이루어지지 않는 객체가 생긴다. 해당 객체들이 Unreachable 객체이고 GC의 대상이 된다.

6. GC 과정에 대해 설명해주세요

객체가 새로 생성되면 가장 먼저 Eden 영역에 할당된다. Eden 영역이 가득차면 Minor GC가 발생하고 Unreachable 한 객체는 지워지고 살아남은 객체들은 Survivor 0 영역으로 이동한다. 해당 과정이 계속 반복되고 계속 살아남은 객체의 age 비트가 특정 값을 넘어가게 되면 Old Generation 으로 이동한다.
Old Generation 또한 꽉차게 되면 모든 Old Generation 영역에 대해 Major GC 가 실행된다.
Major GC는 오래 걸리는 과정이고 다른 모든 스레드를 중단 시킨다. 이 과정을 Stop the world 라고 한다.

7. GC의 알고리즘에 대해 설명해주세요.

GC는 Mark and Sweep 알고리즘을 사용한다.
루트로 부터 사용하는 객체 들에 대해 Mark 를 해두고, Unreachable 한 객체에 대해서 sweep 하여 지운다. 마지막으로는 Compaction 작업을 통해 메모리를 관리 한다.

profile
열심히 해볼게요

0개의 댓글