JVM 이란
- java 바이트코드를 실행하기 위한 가상머신이다.
- 컴파일러: 자바 소스 코드는 컴파일러가 바이트 코드로 변환한다.
JVM의 구성
- 클래스 로더, 실행 엔진, 런타임 데이터 영역, 네이티브 인터페이스 로 구성한다.
- 클래스 로더: 클래스 파일을 메모리에 가져온다
- 실행 엔진: 바이트 코드를 실제로 실행한다.
- 런타임 데이터 영역: 런타임에 필요한 메모리를 관리한다
- 네이티브 인터페이스: c/c++ 등 자바 외부 코드와 연결할 때 사용한다.
JVM 메모리 구조
- 메소드 영역: 지역변수나 호출 정보를 저장한다.
- 힙: 동적으로 할당하는 객체가 저장되는 공간
- 스택: 스레드별로 생성된다.
- PC레지스터: 현재 실행중인 jvm 명령의 주소를 저장한다.
- 네이티브 메서드 스택: jni 를 통해 호출되는 네이티브 코드의 스택이다.
GC (Garbage Collection)
- 더이상 참조되지 않는 객체를 메모리에서 제거하는 기능이다.
- 메모리 관리를 자동화 해주니까 개발자의 부담이 줄어든다는 장점이 있다.
- 단점
- 객체를 메모리에서 제거하려면 일시적으로 애플리케이션이 멈춰야 한다. 이 타이밍을 개발자가 예측하기는 어렵다
- 따라서 실시간성이 중요한 시스템에서는 부적합할 수 있다
GC 를 모니터링 해야 하는 이유
- GC 가 자주 발생하면 애플리케이션 성능이 저하될 수 있다. 따라서 얼마나 자주, 얼마나 오래 멈추는지 확인해야 한다.
- 이를 통해 메모리 사용량이 적절한지, 어느 객체가 오래 살아남는지 등을 알 수 있다. 이를 기반으로 튜닝 포인트를 찾는다.
메모리 누수를 어떻게 확인할 수 있을까
- 메모리 누수는 객체가 참조된 상태로 계속 남아 GC 가 제거하지 못할 때 발생한다.
- JVisualVM, Eclipse MAT 같은 도구로 힙 덤프를 분석할 수 있다.
- 어떤 클래스가 얼마나 많은 객체를 가지고 있는지, 참조 체인이 어떻게 되는지 시각적으로 보여준다.
GC 에서 사용하는 알고리즘
1. Mark and Sweep
2. 카피 알고리즘
3. Generation GC
객체가 얼마나 오래 생존하는지에 따라 관리
4. Parallel GC (-> 자바 8 이 기본으로 채택한 방식)
Java 8 기준으로 GC 는 어떤 방식으로 수행될까
- 힙 메모리를 Young Generation과 Old Generation으로 나눠 관리한다
- Young 영역에서 발생하는 GC를 Minor GC, Old에서 발생하는 GC를 Major GC 또는 Full GC라고 한다
- Young 영역은 Eden과 Survivor 영역 두 개로 나뉘고, 새로 생성된 객체는 Eden에 저장한다.
- Eden이 가득 차면, GC가 실행되고 살아남은 객체는 Survivor 영역으로 이동한다
- 몇 번을 살아남으면 Old 영역으로 이동한다.
- Old 영역은 주로 Mark-Sweep-Compact 알고리즘으로 관리되고, 기본적으로는 Parallel GC가 적용된다.
'프로그래밍 > JAVA' 카테고리의 다른 글
synchronized (0) | 2025.04.03 |
---|---|
volatile (0) | 2025.04.03 |
스레드 생명 주기 (0) | 2025.04.03 |
스레드 생성과 실행 (0) | 2025.04.03 |
List (0) | 2025.03.28 |