끄적끄적
[java]JVM의 구조 본문
JVM이란
- 자바 가상머신으로 운영체제 종류에 영향 받지 않고 독립적으로 자바를 동작하게 해주는 중계자.
JVM의 메모리 구조
- 총 4단계로, Garbage Collector, Execution Engine, Class Loader, Runtime Data Area가 있다.
자바 실행 시 동작 과정
먼저 자바 컴파일러에 의해 자바 소스(.java) 파일은 Byte code형태인 클래스 파일로 변환된다. 이 클래스 파일을 JVM이 읽어가면서 수행된다.
1. Class Loader
- JVM 내로 class를 로드하고 Link 작업을 통해 배치 등 일련의 작업을 한다.
- 런타임 시 동적으로 클래스를 로드한다.
2. Execution Engine
- 클래스 로더를 통해 JVM Runtime Data Area에 배체된 바이트 코드들을 명령어 단위로 읽어서 실행한다.
- 두가지 방식이 존재한다.
- Interprenter : 바이트 코드들을 명령어 단위로 읽어서 실행
- JIT(Just in Time): 바이트 코드 전체를 네이티브 코드로 변경하여 직접 수행. 한번 실행하면 캐시에 저장되어 빠르게 읽을 수 있지만 실행 시간 자체는 Interprenter에 비해 오래걸려 빈도를 체크후에 수행해야 한다.
3. Garbage Collector
- Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다.
- GC가 역할을 하는 시간은 언제인지 정확히 알 수 없다.
4. Runtime Data Area
- JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용할 떄 데이터들을 적재하는 영역.
- Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.
(1) Method Area
- 모든 쓰레드가 공유하는 메모리 영역.
- 코드에서 사용되는 클래스 파일을 클래스 로더로 읽어 클래스 별로 런타임 상수풀, 필드 데이터, 메서드 데이터, 메서드 코드, 생성자 코드 등을 분류해서 저장.
- 저장하는 데이터: 타입 정보 / 런타임 상수 풀/ 필드 정보/ 메서드 정보 / 클래스 변수(static 키워드로 선언한 변수)
- 클래스 변수
- static 키워드로 선언된 변수를 의미.
- 모든 인스턴스에 공유. 클래스를 사용하기 전에 미리 메모리에 할당되어 있음.
- final class 변수는 상수로 치환되어 상수풀에 복사.
- static 변수는 이곳에 저장. static 클래스 형 변수는 레퍼런스 변수만 저장되고 실제 데이터는 Heap에 저장
- 런타임 상수 풀
- Type의 모든 상수 정보를 가지고 있음.
- 인덱스 번호를 통해 접근
- Object 접근 등 모든 참조를 위한 핵심 요소
- 타입 정보
- 타입의 이름, 하위 클래스 이름
- 타입 클래스/ 인터페이스 여부
- 타입의 modifier(public/abstract/final)
- 연관된 인터페이스 이름 리스트
- 필드 정보
- 필드 타입
- 필드 제어자
- 메서드 정보
- 메서드 이름, 리턴 타입, 파라미터
- 메서드 제어자
- 메서드 byteCode
(2) Runtime Constant Pool
- Method Area에 속하지만 독자적인 중요성을 갖는다.
- 클래스 파일 Constant_pool 테이블에 해당
- Type, Field, Method에 대한 모든 래퍼런스 저장
- JVM은 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리 상의 주소를 찾아 참조
(3) Heap Area
- 모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역
- 메서드 에리아에 로드된 클래스만 생성이 가능
- 가비지 컬렉터가 제거하는 영역
(4) Stack Area
- 메서드 호출 시마다 각각의 (메서드만을 위한) 스택 프레임이 생성
- 메서드 안에서 사용되는 값들을 저장하고
- 호출된 메서드의 매개변수, 지역 변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장
- 메서드 수행이 끝나면 프레임 별로 삭제
(5) PC Register
- 쓰레드가 시작될 때 생성. 쓰레드마다 하나씩 존재
- 현재 수행중인 JVM 명령의 주소를 가짐
(6) Native Method Stack
- 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역
모든 쓰레드가 공유-> Method Area, Heap Area
쓰레드 별로 생성 -> Stack Area, PC Register, Native Method Stack
참조)
https://steady-coding.tistory.com/305
'CS 공부' 카테고리의 다른 글
thread와 런에이블 (0) | 2022.03.20 |
---|---|
[java] static (0) | 2022.03.18 |
[java] 배열 리스트의 동적 동작 (0) | 2022.03.17 |
[java]String 생성과 메모리 (0) | 2022.03.17 |
[java]final 키워드 (0) | 2022.03.17 |