JAVA

[JAVA] GC란?

코카멍멍 2023. 11. 9. 13:32
반응형

GC란?

프로그램이 동적으로 할당했던(heap 영역) 메모리 영역 중 필요 없게 된 영역을 여러 알고리즘을 통해 해제하는 것입니다.

장점

- 메모리 누수 방지
- 해제된 메모리에 접근 방지
- 해제한 메모리 또 해제 방지

단점

- GC 작업은 순수 오버헤드
- 개발자는 언제 GC가 메모리를 해제하는지 모릅니다.

Reference Counting

객체의 접근할 수 있는 카운팅 넘버를 통해 현재 참조중인지 확인하는 알고리즘
문제점 : 힙 객체가 서로 참조하고 있으면 순환참조로 GC제거 대상에서 제외된다

Mark And Sweap

root로 부터 연결되어 있다면 rechable 연결되어 있지 않다면 unreachable

단점

  • 의도적으로 GC를 실행시켜야 한다.
  • 어플리케이션 실행과 GC 실행이 병행됩니다.

Root Space의 위치는??

Heap 영역 확인

처음 생성된 객체들은 Eden에 저장되고 살아남을 때마다 Survival0, Survival1 으로 이동하며 몇번 Minor GC로 부터 살아남았는지 카운팅합니다. 일정 횟수 이상 살아 남았다면 Old Generation으로 객체를 이동시킵니다.

GC를 사용할 때 문제점

  • Stop the World
    Old Generation의 객체를 정리할 때 일어납니다. 프로그램을 멈추고 메모리를 정리하는데 사용됩니다.

GC 방식

Serial GC

- 싱글 스레드로 동작하는 가장 간단한 GC
- 실행시 모든 스레드의 STW발생
- 클라이언트 앱 또는 일시 중지 시간에 대한 제한이 없는 경우에 대부분 선택하는 GC

Parallel GC

- Serial GC와 다르게 힙 영역 관리를 위해 멀티 스레드를 활용하는 GC 하지만 GC 수행 시에는 똑같이 다른 앱 스레드도 정지(STW)
- 여러 개의 쓰레드로 GC를 실행
- 멀티코어 환경에서 사용
- Java 8의 default GC 방식

CMS GC

- CMS(Concurrent Mark Sweep)은 멀티 GC 스레드를 활용한 GC
- Stop the World최소화를 위해 고안
- GC 작업을 어플리케이션과 동시에 실행
- G1 GC 등장에 따라 Deprecated

G1 GC

- 힙을 동일한 크기의 영역으로 분할하여 관리 (해당 영역들은 가상 메모리의 연속 범위)
- Garbage Frist(G1)
- Heap을 Region으로 나누어 사용
- Java 9부터는 G1 GC를 기본 GC알고리즘으로 사용

참조

테코톡 조엘의 GC

반응형