자바의 가비지 컬렉션은 JVM 의 핵심 기능 중 하나로
도달 가능성 기반으로 동작한다
루트 객체까지 참조가 이어지지 않는 메모리에 대한 회수를 한다는 점에서
JS 와 비슷하지만 동작 방식이 다르다
자바 GC는 힙 영역을 효율적으로 관리하기 위해 세 가지 영역으로 구분하여 관리한다
새로 생성된 객체가 할당되는 영역
대부분의 객체는 수명이 짧기 때문에 Young Generation 에서 자주 가비지 컬렉션이 발생
JVM 에서 관리된다
Eden 영역과 Survivor 영역(S0, S1)으로 다시 한 번 나뉜다
Young Generation 에서 여러 번의 가비지 컬렉션 후에도 살아남은 객체가 이동하는 영역
Young Generation 보다 가비지 컬렉션 빈도가 낮다
힙(Heap) 영역에 속하며, JVM에 의해 관리된다
주로 Full GC(Major GC)가 발생할 때 가비지 컬렉션 대상이 된다
Java 8부터 Permanent Generation 을 대체한 메모리 영역으로
클래스 메타데이터, 메서드 정보, 상수 풀, 정적 변수 등 클래스 수준의 데이터를 저장한다
Permanent Generation 은 힙 영역에 속해 JVM에 의해 관리되었으며, 크기가 제한되어 있었다
Metaspace 는 네이티브 메모리 영역에 속해 OS에 의해 관리되며, 기본적으로 크기가 제한되지 않는다
Full GC는 Old Generation(오래된 객체 영역)에서 발생하는 가비지 컬렉션
Old Generation 의 메모리가 부족해지거나, 명시적으로 System.gc()를 호출했을 때 발생
Full GC가 실행되는 동안 애플리케이션의 모든 스레드가 중단되는 "Stop-the-World" 현상이 발생하여 성능에 영향을 줄 수 있다
Full GC는 메모리 단편화를 해소하기 위해 메모리 압축(Compaction) 작업을 수행할 수 있다
힙(Heap) 영역:
힙 영역은 JVM이 관리하는 메모리 영역으로, 객체 인스턴스가 생성되는 곳입니다.
Young Generation과 Old Generation이 힙 영역에 속합니다.
힙 영역은 JVM의 GC 알고리즘에 따라 자동으로 메모리가 관리됩니다.
네이티브 메모리 영역:
네이티브 메모리 영역은 운영체제(OS)가 관리하는 메모리 영역입니다.
Metaspace는 네이티브 메모리 영역에 위치하며, 클래스 메타데이터, 메서드 정보, 상수 풀, 정적 변수 등 클래스 수준의 데이터를 저장합니다.
네이티브 메모리는 JVM의 GC 알고리즘이 직접적으로 관리하지 않으며, 운영체제의 메모리 관리 방식에 따릅니다.
주요 차이점:
관리 주체: 힙 영역은 JVM이 관리하고, 네이티브 메모리 영역은 OS가 관리합니다.
저장 데이터: 힙 영역은 객체 인스턴스를 저장하고, 네이티브 메모리 영역은 클래스 수준의 데이터를 저장합니다.
메모리 관리: 힙 영역은 JVM의 GC 알고리즘에 따라 관리되고, 네이티브 메모리 영역은 OS의 메모리 관리 방식에 따릅니다.
힙 영역 내부에서만 참조가 일어나더라도 GC 의 대상이 된다 (순환참조)