Goal
- JVM의 실행과정과 구조를 알아본다
- JAVA7까지의 메모리모델과 JAV8이후의 메모리모델의 차이점을 알아본다
JVM 이란 ?
JVM(Java Virtual Machine)은 자바 가상 머신을 의미하며, 자바 언어를 실행하기 위한 가상 머신이다
자바와 운영체제(OS)와 하드웨어에 독립적으로 작동하기 때문에, 자바 프로그램은 JVM을 통해 어떤 운영체제(Window, Linux, Mac)에서든 실행이 가능하다.
메모리 관리와 같은 작업을 자동으로 처리하여 프로그램의 안전성을 보장하며, 가비지 컬렉터(GC)를 통해 더 이상 사용되지 않는 객체를 제거하여 메모리누수를 방지한다.
또한, 멀티쓰레딩을 지원하므로써 하나의 자바프로그램에서 여러 작업을 동시에 수행 가능하다.
JAVA 프로그램의 실행 단계
- 자바 컴파일러에 의해 자바 소스 파일(Java Code.java)은 바이트 코드(Byte Code.class) 로 변환
- 이러한 바이트 코드를 JVM에서 읽어, 어떤 운영체제에서든 프로그램을 실행할 수 있도록 한다.
JVM 의 실행 과정
- Class Loader : 클래스 파일을 로드하고 JVM 메모리에 올리는 역할
- 클래스 파일 로딩
- 클래스 파일 검증
- 클래스 파일 링크
- 클래스 파일 초기화
- Execution Engine : JVM 내부에서 바이트 코드를 기계어 코드로 변환하고 실행하는 역할
- 바이트 코드 해석 및 실행
- JIT 컴파일러를 사용하여 프로그램 실행 속도를 향상시키는 기능
- Garbage Collector
- 메모리 관리를 담당. 자바 객체들의 생성과 소멸을 추적하고, 더 이상 사용되지 않는 객체들을 메모리에서 해제
- Runtime Data Area
- JVM이 프로그램을 실행하기 위해 사용하는 메모리 영역으로, 프로그램을 실행하는 동안 생성되는 모든 데이터를 저장
Method Area | 모든 스레드에서 공유하는 메모리 영역으로, 클래스 파일에서 읽은 정보를 저장하는 영역. 클래스의 정보(이름, 메소드, 변수 등)를 저장 |
Heap Area | 동적으로 생성된 객체(인스턴스 - new 키워드로 생성된 객체와 배열)를 저장하는 메모리 영역 Garbage Collector의 대상, JVM이 시작될 때 지정된 초기 크기 및 최대 크기로 할당 |
Stack Area | 스레드마다 별도로 존재하며, 메소드 호출 시 메소드의 지역 변수, 매개 변수, 리턴 값 등의 정보를 임시 저장하는 메모리 영역. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제 |
PC Register | 현재 실행 중인 JVM 명령의 주소를 저장하는 메모리 영역 |
Native Method Stack | 자바 코드가 아닌, Native 코드(다른 언어로 작성된 코드)를 위한 메모리 영역으로, 스택의 일종 |
Heap 영역 구조
GC의 대상으로 5개의 영역(eden, survivor1, survivor2, old, permanent)으로 나뉘며 이는 효율적으로 GC가 일어나게 하기 위함.
- Young Generation은 새로운 객체가 할당되는 공간이며, Eden 영역과 2개의 Survivor 영역
- Minor GC
- Young Generation 영역에서 더 이상 참조되지 않는 객체를 제거
- Eden 영역에서 살아남은 객체를 1개의 Survivor 영역에 복사
- 다른 Survivor 영역에 있는 객체들과 Survivor 영역으로 이동된 객체들을 비교하여 더 오래된 객체를 다음 Survivor 영역으로 복사
- 여전히 살아있는 객체들은 Old Generation으로 이동
- 전체적인 프로그램 실행 시간 중 상대적으로 빈번하게 발생하는 GC
- 메모리를 최대한 빠르게 회수하여, Young Generation의 용량을 유지하며, 메모리 누수를 방지
- Minor GC
- Old Generation은 Young Generation에서 살아남은 객체들 중 일정 기간 이상 참조되는 객체들이 저장되는 공간
- Major GC(Full GC)
- Old Generation 영역에서 더 이상 참조되지 않는 객체를 제거
- Young Generation에서 살아남은 객체를 Old Generation으로 이동
- Young Generation에 비해 발생 빈도가 적고, GC가 실행되는 동안 프로그램 실행이 중단되므로, 실행 시간에 민감한 프로그램에서는 문제를 일으킬 수 있다
- Old Generation 영역의 메모리 누수를 방지하고, 전체적인 프로그램 성능을 향상시키는 역할
- Major GC(Full GC)
JAVA7 까지와 JAVA8 이후의 메모리모델 차이
- JDK7까지는 permanent영역이 heap에 존재
- JDK8부터는 permanent 영역은 사라지고 일부가 "meta space 영역"으로 변경됨.(meta space 영역은 Native stack 영역에 포함됨)
참고
https://jeong-pro.tistory.com/148
'JAVA > about java' 카테고리의 다른 글
[String] String 빈 값 및 Null 체크 (0) | 2023.04.19 |
---|---|
[Interface, abstract, enum] 인터페이스, 추상클래스, enum / 예외처리 (0) | 2023.04.19 |
[Muatable and Immutable] 가변 객체와 불변 객체 (0) | 2023.04.17 |
[Access Modifier, extends, Object] 접근제어자 / 상속 / Object 클래스 (0) | 2023.04.16 |
[Class, Data Type, Array] 클래스 / 객체 / 변수 / 기본 자료형 / 조건문 / 배열 / 참조 자료형 (0) | 2023.04.11 |