▶GC란 무엇인가?
GC는 자바의 메모리 관리 방법 중 하나이다.
JVM의 Heap영역에서 동적으로 할당했던 메모리 영역 중 필요없게 된 메모리 영역을 주기적으로 삭제하는 프로세스이다.
C/C++에서는 이러한 GC가 없기 때문에 개발자가 수동으로 메모리 할당과 해제를 일일히 해줘야한다. 이러한 언어를 Unmanaged 언어라고 한다.
반대로 자바같이 GC가 알아서 메모리를 관리해주는 언어를 Managed 언어라고 한다.
따라서, GC가 탑재되어 있는 JVM을 사용하는 Java는 메모리 관리를 다 해주기 때문에 개발자 입장에서는 메모리 관리, 메모리 누수(Memory Leak)문제에 대해 신경을 덜 써도 된다는 장점이 있다.
하지만 단점도 있는데,
- 개발자가 메모리가 언제 해제되는지 정확하게 알 수 없다.
- GC가 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.
- 오버헤드 : 어떤 처리를 하기 위해 들어가는 간접적인 처리시간,메모리 등을 말함
GC가 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 되기도 한다.
GC의 사용이 적합하지 않는 소프트웨어가 있을 수도 있다.
▶ 가비지 컬렉션의 대상이 되는 객체들
객체들은 실질적으로 Heap 영역에서 생성되고 Method Area와 Stack Area에서는 Heap영역에 생성된 인스턴스의 주소만 참조하는 형식으로 구성되어있다.
이렇게 Heap영역에 생성된 객체 중 메소드가 끝나는 등 특정 이벤트로 인하여 어디서도 참조하지 않는 객체가 발생한다.
이러한 객체들을 Unreachable하다고 하며 주기적으로 GC가 제거해준다.
▶ 실행과정
▷ 힙영역(Heap Area)
- new키워드로 생성된 인스턴스와, 배열이 생성되는 영역
- 주기적으로 GC가 제거하는 영역
- Java8 부터는 Permanent Gen이 사라지고 Metaspace가 생겼다. PermGen은 Heap영역에 있었지만 MetaSpace는 OS가 관리하는 Native Memory 영역에 있음.
- Native Memory 영역은 OS가 자동으로 크기를 조절함. PermGen은 JVm에 의해 크기가 장제되어있었음.
- 즉, 각종 메타정보를 OS가 관리하는 영역으로 옮겨 PermGen의 사이즈 제한을 없앤것이라고 할 수 있음.
▷ Minor GC
1. Heap영역에 객체가 생성되면 최초로 Eden영역에 할당된다.
2. Eden 영역의데이터가 꽉 차게되면 참조 정도에 따라 survivor의 빈공간으로 이동되거나 회수된다.
3. 살아남은 객체는 횟수를 뜻하는 age의 값을 1 증가시켜준다. 이 age값은 Object Header에 기록한다.
4. Eden영역이 꽉차게 되면 한번 더 GC가 작동한다.
5. 살아남은 객체는 age를 1 증가시켜준다. 이걸 반복한다.
+ Survivor 영역 중 1개 영역은 반드시 사용되어야 하며
만약 두 Survivor 영역 모두 데이터가 존재하거나, 존재하지 않는다면 현재 시스템이 정상적이지 않음을 파악할 수 있다.
▷Major GC
1. 객체의 age가 임계값에 도달하게 되면, 이 객체들은 Old Generation으로 이동된다.
이렇게 이동되는걸 promotion이라고 부른다.
2.위의 과정이 반복되며 Old Generation영역의 메모리가 부족하게 되면 Major GC가 작동한다.
▷Major GC의 특징
Major GC에서 GC를 실행하는 스레드를 제외한 모든 스레드는 작업을 멈춘다.
이를 Stop-the-World라고 한다.
또한 Mark and Sweep 작업을 해야하므로 CPU에 부하를 주기 때문에 멈추거나 버벅이는 현상이 일어난다.
Major GC는 일반적으로 Minor GC보다 10배 이상의 시간을 사용한다.
따라서 자바 개발진들은 끊임없이 가비지 컬렉션 알고리즘을 발전시켜왔다.
'학과 공부 > Java' 카테고리의 다른 글
다형성이란? 오버로딩와 오버라이딩, @Override 어노테이션 (1) | 2024.04.18 |
---|---|
[Java] JVM에 대해서 알아보자 (0) | 2024.02.22 |
[Java] 자바 언어 시작하기(JDK 설치, 자바 환경변수 설정) (1) | 2024.02.04 |