728x90
반응형
구성 요소
- 클래스 로더 서브 시스템(Class Loader Subsystem)
- 자바 .class 파일을 읽어 JVM 메모리 적재
- 역할
- 로딩: .class 파일 로드
- 링크: 클래스간 종속성 해결
- 초기화: 정적 필드와 정적 블록을 실행하여 초기화
- 런타임 데이터 영역 (Runtime Data Areas)
- Method Area
- 클래스의 메타데이터, 정적 변수, 상수 풀(Constant Pool) 저장
- 모든 스레드가 공유
- Heap
- 객체와 배열이 저장되는 공간
- 모든 스레드가 공유하며 Garbage Colletor가 관리
- Stack
- 각 스레드마다 별도로 생성되는 영역으로 메서드 호출과 관련된 로컬 변수, 매개 변수, 연산 중간 결과 저장
- LIFO(Last In First Out) 구조
- PC Register
- 각 스레드마다 생성되며 현재 실행중인 명령의 주소 저장
- Native Method Stack
- 네이티브 메서드(C, C++ 등 자바 외부 언어로 작성된 메서드)의 실행을 지원
- Method Area
- 실행 엔진(Execution Engine)
- 자바 바이트코드를 기계어로 변환하여 실행
- 인터프리터
- 바이트코드를 한 줄씩 해석하여 실행
- 빠른 실행 시작이 가능하지만 느림
- JIT 컴파일러 (Just-In-Time)
- 반복적으로 실행되는 코드(핫스팟)를 기계어로 컴파일하여 캐싱
- 성능 최적화에 기여
- Garbage Collector(GC)
- 더이상 참조되지 않는 객체를 정리하여 메모리 확보
- Native Interface (JNI, Java Native Interface)
- 네이티브 라이브러리(C, C++)와 통신하기 위한 인터페이스
- JVM 내부 실행 프로세스
- JVM은 자바 프로그램 실행 시 OS에서 메모리와 CPU 자원을 요청하고 관리
동작 원리
- Java 코드 작성 및 컴파일
- .java 파일 작성 -> javac 컴파일러를 사용해 바이트코드(.class 파일) 생성
- 클래스 로드 및 검증
- 클래스 로더가 .class 파일을 JVM 메모리로 로드
- 로드된 클래스가 JVM의 규칙에 맞는지 검증 (바이트코드의 유효성 확인)
- 메모리 할당 및 초기화
- 클래스 정보는 Method Area, 객체는 Heap, 메서드 호출 관련 정보는 Stack에 저장
- 실행
- Execution Engine이 바이트코드를 해석(인터프리터)하거나 JIT 컴파일러로 기계어로 변환 후 실팽
- 네이티브 메서드 호출 시 Native Interface 사용
- Garbage Collection
- 더이상 참조되지 않는 객체를 자동으로 정리하여 메모리를 확보
- 개발자가 메모리 관리를 명시적으로 할 필요가 없음
Stack 과 Heap 메모리의 차이
- Stack
- LIFO 구조, 메서드 호출 시 지역 변수와 함수 호출 정보 저장
- 속도: 접근 속도가 빠르며 컴파일 타임에 크기가 고정됨
- 용도: 메서드 호출, 지역 번수, 기본 자료형, 함수 호출 기록 등
- 관리: 메서드 실행이 끝나면 자동으로 메모리에서 제거됨
- 함수 내부에서 선언된 int a= 10; 은 Stack에 저장
- Heap
- 동적으로 메모리를 할당하며 크기가 가변적
- 속도: Stack보다 접근 속도가 느림
- 용도: 객체나 클래스 변수와 같은 동적으로 생성된 데이터를 저장
- 관리: GC가 관리함
- Person person = new Person(); 으로 생성한 객체는 heap에 저장
728x90
반응형
'Java & Kotlin' 카테고리의 다른 글
Java 에서의 동시성 관리 방법 (1) | 2025.01.27 |
---|---|
Garbage Collection (0) | 2025.01.26 |
Java & Kotlin 장단점 (0) | 2025.01.25 |
PriorityQueue (우선순위 큐) (0) | 2023.07.07 |
Kotlin? (0) | 2022.08.28 |