가비지(Garbage)
- 더 이상 사용되지 않거나 참조되지 않는 메모리 상의 객체나 데이터
- 가비지는 프로그램 실행 중에 동적으로 할당되었지만, 현재는 어떤 변수나 코드에서도 접근할 수 없는 상태가 되어 메모리에서 제거되어야 하는 대상이 된다
- 가비지 컬렉터는 이러한 불필요한 객체들을 자동으로 식별하고 메모리를 회수하여, 메모리 누수를 방지하고 시스템의 안정성을 유지한다
가비지 컬렉션(Garbage Collection, GC)
- 프로그래밍 언어에서 동적으로 할당된 메모리 중 더 이상 필요하지 않은 영역을 자동으로 해제하는 메모리 관리 기법
- 개발자는 메모리 관리에 대한 부담을 덜고 코드 작성에 집중할 수 있다.
- 가비지 컬렉션은 주기적으로 힙 메모리를 스캔하여 사용되지 않는 객체를 찾아 메모리를 회수하며, 이 과정에서 '표시(Mark)', '청소(Sweep)', '압축(Compact)' 등의 단계를 거친다.
- Java와 같은 언어에서는 JVM이 이러한 가비지 컬렉션을 자동으로 수행하여 메모리 누수를 방지하고 프로그램의 안정성을 높인다.
- C언어나 C++ 같은 언어는 수동으로 메모리를 관리하도록 설계된 반면, Java와 C#과 같은 언어에서는 가비지 컬렉션을 통해 자동으로 메모리를 관리할 수 있도록 한다.
- 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 객체(garbage)를 주기적으로 제거하는 프로세스
JVM의 구조와 힙 영역
- 자바 가상 머신(JVM)은 자바 프로그램의 실행을 담당하는 가상 환경으로, 메모리 관리를 포함한 여러 기능을 제공한다
- JVM의 메모리 구조는 크게 메소드 영역(Method Area), 힙 영역(Heap Area), 스택 영역(Stack Area), PC 레지스터, 네이티브 메소드 스택으로 구성된다
- 메소드 영역(Method Area): 클래스 구조와 같은 메타데이터를 저장하는 공간
- 힙 영역(Heap Area): 객체와 배열이 동적으로 할당되는 공간으로, 가비지 컬렉션의 주요 대상이 된다
- 스택 영역(Stack Area): 각 스레드마다 존재하며, 메소드 호출 시 생성되는 프레임을 저장한다
- PC 레지스터: 현재 실행 중인 명령의 주소를 저장한다
- 네이티브 메소드 스택: 자바 이외의 네이티브 코드를 실행할 때 사용된
Stop-the-world (STW)
- 가비지 컬렉션(GC) 과정에서 JVM이 애플리케이션의 모든 실행을 일시적으로 멈추는 현상
- GC를 수행하는 동안, GC를 실행하는 스레드를 제외한 모든 애플리케이션 스레드의 작업이 중단되며, GC 작업이 완료된 후에야 다시 재개된다
- 대부분 JVM에서 GC 튜닝이라고 하면 이 Stop-the-world 시간을 줄이는 것을 의미한다.
- GC가 메모리를 정리하는 동안 다른 스레드가 메모리를 변경하면 일관성이 깨질 수 있기 때문에, 이러한 문제를 방지하기 위해 애플리케이션의 실행을 일시적으로 중단시키는 것
- 가비지 컬렉션 과정에서 시스템의 안정성과 메모리 일관성을 유지하기 위해 필요한 과정이지만, 그로 인한 애플리케이션의 일시 중단을 최소화하기 위한 노력이 지속되고 있다
가비지 컬렉션 (Garbage Collection) 동작 방식
- 가비지 컬렉션은 힙 영역에서 더 이상 참조되지 않는 객체를 찾아 메모리를 해제하는 과정을 의미한다
- JVM은 다양한 가비지 컬렉션 알고리즘을 사용하여 이 작업을 수행한다.
- 대표적인 알고리즘으로 마크-스위프(Mark-Sweep), 마크-컴팩트(Mark-Compact), 복사(Copying) 방식이 있다.
- 마크 단계(Mark Phase) : 힙 영역에서 live objects를 찾아내는 과정이다 / GC root라고 불리는 지점에서부터 그래프 순회를 통해 모든 살아있는 객체(live objects)를 찾아 마킹한다.
- 스위프 단계(Sweep Phase) : 참조하고 있지 않는 객체 즉 Unreachable 객체들을 Heap에서 제거한다. / mark bit가 비어있는 메모리를 발견하면 할당 리스트에서 죽은 객체들을 제거한다
- 컴팩트 단계(Compact Phase) : Mark & Sweep 단계를 거치면 메모리 단편화(fragment)가 생긴다 / Sweep 후 분산된 객체들을 Heap의 시작 주소로 모아 (재배치하여 할당된 메모리가 연속되도록 한다) 메모리가 할당된 부분과 그렇지 않은 부분으로 압축한다. (가비지 컬렉터의 종류에 따라 진행하지 않는 경우도 있음)
=> 이러한 과정은 JVM 내부적으로 자동 수행되며, 개발자는 메모리 관리에 대한 부담을 덜 수 있다.
JVM의 구조, Heap Area
- 자바 가상 머신(JVM)은 자바 애플리케이션을 실행하기 위한 가상 환경으로, 자바 바이트코드를 OS에 맞게 해석하고 실행하는 역할을 한다.
- JVM은 여러 구성 요소로 이루어져 있으며, 그중 런타임 데이터 영역(Runtime Data Area)은 프로그램 실행 중 필요한 데이터를 저장하는 메모리 공간이다.
- 이 영역은 메서드 영역(Method Area), 힙 영역(Heap Area), 스택 영역(Stack Area), PC 레지스터(PC Register), 네이티브 메서드 스택(Native Method Stack)으로 구성된다
- 힙 영역은 모든 스레드가 공유하는 공간으로, new 키워드를 통해 생성된 객체와 배열이 저장된다.
- 이 영역은 동적으로 메모리를 할당하며, 가비지 컬렉터(Garbage Collector, GC)에 의해 관리된다.
- 가비지 컬렉션은 더 이상 참조되지 않는 객체를 자동으로 메모리에서 해제하여 메모리 누수를 방지하고, 개발자가 메모리 관리에 신경 쓰지 않도록 도와준다
- 가비지 컬렉터는 주기적으로 힙 영역을 검사하여 사용되지 않는 객체를 찾아내고, 해당 메모리를 회수한다
- 이 과정에서 JVM은 모든 스레드를 일시 정지시키는 'Stop-the-World' 이벤트를 발생시켜 메모리의 일관성을 유지한다.
- 가비지 컬렉션의 효율적인 동작은 애플리케이션의 성능과 안정성에 큰 영향을 미치므로, JVM은 다양한 알고리즘과 튜닝 옵션을 제공하여 가비지 컬렉션을 최적화할 수 있도록 지원한다.
=> JVM은 자바 애플리케이션의 실행을 지원하는 가상 환경으로, 힙 영역에 생성된 객체들을 가비지 컬렉터를 통해 자동으로 관리하여 메모리 효율성을 높이고 개발자의 부담을 줄여준다.
JVM의 힙(heap) 영역
- 동적으로 레퍼런스 데이터가 저장되는 공간으로서, 가비지 컬렉션에 대상이 되는 공간이다.
- Heap영역은 처음 설계될 때 다음의 2가지를 전제 (Weak Generational Hypothesis)로 설계되었다.
1) 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다.
2) 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.
=> 객체는 대부분 일회성되며, 메모리에 오랫동안 남아있는 경우는 드물다는 것이다.
- 이러한 특성을 이용해 JVM 개발자들은 보다 효율적인 메모리 관리를 위해, 객체의 생존 기간에 따라 물리적인 Heap 영역을 나누게 되었고 Young 과 Old 총 2가지 영역으로 설계하였다. (초기에는 Perm 영역도 존재하였지만 Java 8부터 제거되었다)
GC는 발생하는 영역과 시점에 따라 주로 Minor GC와 Major GC로 구분된다
Minor GC
- 힙 메모리의 Young 영역에서 발생하는 GC이다
- Young 영역은 새롭게 생성된 객체가 저장되는 공간으로, Eden 영역과 두 개의 Survivor 영역(S0, S1)으로 구성된다.
- 객체가 생성되면 Eden 영역에 할당되며, Eden 영역이 가득 차면 Minor GC가 실행된다.
- 이 과정에서 살아남은 객체는 Survivor 영역으로 이동하고, 여러 번의 Minor GC를 거쳐도 살아남은 객체는 Old 영역으로 이동하게 된다.
- 비교적 짧은 시간 동안 수행되지만, 수행 시 애플리케이션의 모든 스레드를 일시 정지시키는 'Stop-the-World' 현상이 발생합니다.
Major GC
- 힙 메모리의 Old 영역에서 발생하는 GC이다.
- Old 영역은 여러 번의 Minor GC를 거친 후에도 살아남은 객체들이 저장되는 공간으로, 메모리 용량이 크고 객체의 수명이 길다.
- Old 영역의 메모리가 부족해지면 Major GC가 실행되며, 이 과정은 Minor GC보다 더 많은 시간을 소요하고, 역시 'Stop-the-World' 현상을 유발한다.
- Major GC의 빈도를 최소화하는 것이 애플리케이션 성능 최적화에 중요하다
=> GC의 효율적인 관리와 튜닝을 위해서는 애플리케이션의 특성과 JVM의 메모리 구조를 고려하여 적절한 GC 알고리즘을 선택하고, 힙 메모리의 크기와 Young 및 Old 영역의 비율 등을 조정하는 것이 필요하다
📝
가비지 컬렉션(GC)은 더 이상 사용되지 않는 객체를 자동으로 제거하여 메모리 누수를 방지하는 메모리 관리 기법이다.
Java에서는 JVM이 GC를 수행하며, 개발자는 직접 메모리를 관리할 필요가 없다.
GC의 주요 과정은
- Mark: 사용 중인 객체 식별
- Sweep: 참조되지 않는 객체 제거
- Compact: 메모리 단편화 방지 (일부 GC에서 수행)
GC는 힙 영역에서 동작하며, 주요 GC 종류는
- Minor GC: Young 영역에서 수행 (빠름, 자주 발생)
- Major GC (Full GC): Old 영역에서 수행 (느림, 성능 저하 유발)
GC 과정에서 Stop-the-World(STW)가 발생하여 애플리케이션이 일시 중지될 수 있으며, 이를 최소화하는 것이 성능 최적화의 핵심이다.
Java는 Serial, Parallel, G1, ZGC 등의 다양한 GC 알고리즘을 제공하여 상황에 맞게 최적화할 수 있다.
refer to
https://mangkyu.tistory.com/118
https://danyoujeong.tistory.com/214
https://evoblog.life/mark-sweep/
https://s-y-130.tistory.com/111
'IT > IT' 카테고리의 다른 글
사용 중인 포트 강제 중단 (0) | 2025.01.23 |
---|---|
Web3 (0) | 2025.01.17 |
윈도우11 MS 로그인 없이 로컬 계정으로 로그인 (0) | 2024.11.27 |
PC 세팅 (0) | 2024.11.18 |
Git 커밋 메시지 규칙 (0) | 2024.10.26 |