1. JDK, JRE, JVM
JDK
- 자바 개발환경으로 자바 어플리케이션을 개발하기 위해 필요한 도구를 제공한다.
- 자바 언어를 바이트 코드로 컴파일 해주는 자바 컴파일러(javac), 자바 클래스 파일을 해석해주는 역어셈블리어(javap) 등이 있다.
JRE
- 자바 실행환경으로 JVM, 자바 클래스 라이브러리, 기타 자바 어플리케이션 실행헤 필요한 파일들을 포합한다.
JVM
- 자바 가상 머신으로 자바 어플리케이션을 실행하는 가상 머신이다. 실제 컴퓨터로 부터 Java어플리케이션 실행을 위한 메모리를 할당받아 Runtime Data Area를 구성한다.
2. Runtime Data Area
자바 가상 머신은 프로그램 실행 중 다양한 런타임 데이터 영역을 사용한다. 런타임 데이터 영역은 모든 스레드들이 공유하는 영역과 스레드 별 할당되는 영역으로 구분된다. JVM을 시작하면 Heap 영역과 Method 영역이 생성되며 해당 영역들은 모든 스레드들이 공유한다. 각 스레드가 시작 될 때마다 스레드마다 PC Register, Stack, Navtive Method Stack이 생성되며 스레드가 종료될 때 사라진다. 마지막으로 모든 스레드들이 실행되고 종료되면 JVM이 종료되면서 Heap 영역과 Method 영역도 사라진다.
Stack
- 지역 변수, 함수의 실행 결과를 저장하며 함수 호출과 반환을 담당한다.
- 생명주기 : 쓰레드 시작 ~ 종료(쓰레드별 별도 관리)
Heap
- 클래스의 인스터스들과 배열들이 저장되는 공간이다.
- 가비지 컬렉션라는 동적 메모리 관리 시스템에 의해 관리된다.
- 힙 구성 방식, 가비지 컬렉션의 알고리즘은 JVM 구현체의 재량으로 자유롭게 구성된다.
- 생명주기 : 프로그램 시작 ~ 종료(GC대상)
Method(Static)
- 런타임 상수 풀, 필드, 함수, 코드 등 클래스와 인터페이스의 구조가 저장되는 공간이다.
- 생명주기 : JVM 실행 ~ JVM 종료
Runtime Constant Pool
- 런타임 상수 풀은 클래스, 인터페이스 마다 존재하며 클래스 파일의 constant pool 테이블 영역이 저장되는 공간이다.
- 각 클래스, 인터페이스의 전역 변수, 함수, 인스턴스 변수, 함수에 대한 심볼릭 링크가 존재한다.
- 전역 변수와 전역 함수는 컴파일 시점에 할당되어 고정된 값으로 존재하며 인스턴스 변수와 인스턴스 함수는 심볼릭 링크로 존재하며 실행 시점에 고정된 주소로 변환된다.
- 런타임 상수 풀은 클래스가 생성되어 Heap에 할당될 때 만들어지며 클래스가 삭제되면 사라진다.
3. Java 동작원리
실행순서
- 자바 프로그램이 시작되면 JVM은 OS로부터 이 프로그램이 필요로하는 메모리를 할당받는다.
JVM은 이 메모리를 용도에 따라 영역을 나눠 관리한다. - Java Compiler 가 자바 소스코드(*.java)를 읽어들여 자바 바이트 코드(*.class)로 변환시킨다.
- Class Loader 를 통해 class 파일들을 JVM으로 로딩한다.
- 로딩된 class 파일들은 Execution engine 을 통해 해석된다.
- 해석된 바이트 코드는 Runtime Data Area 에 배치되어 실질적인 수행이 이뤄지게 된다.
'백엔드 면접준비 > Java' 카테고리의 다른 글
3. Java Collection Framework(JCF) (1) | 2025.02.03 |
---|---|
2. Java 멀티쓰레드 환경(volatile, synchronized, atomic) (1) | 2025.02.02 |