JVM 이란
JVM(Java Virtual Machine)이란 Java 어플리케이션을 실행하는 프로그램입니다. JRE(Java Run Environment) 의 한 부분으로 JVM은 main 메서드를 java code 에서 실행시키는 주체입니다. 그리고 .java
파일에서 컴파일된 결과인 .class
파일들을 load, link, initialize 합니다.
Class Loader
클래스로더는 JVM 의 하위시스템으로 class 파일들을 메모리로 로드하는 역할입니다. Java 프로그램을 실행시킬 때 클래스로더를 통해 class 파일을 메모리로 로드합니다. Java 에서는 3가지 클래스로더들이 있습니다.
- Bootstrap ClassLoader
- Extension ClassLoader
- System ClassLoader
Execution Engine
다음으로 구성되어 있습니다.
- 가상 프로세서
- 인터프리터 Interpreter: 바이트코드를 읽고 명령어를 수행합니다.
- JIT(Just-in-Time) 컴파일러: 기존 인터프리터로만 수행하다보면 성능이 느리다는 단점이 있었습니다. 성능향상을 위해 도입되었습니다. 비슷한 기능을 가진 바이트 코드 부분을 동시에 컴파일하여 컴파일 필요 시간을 단축시킵니다. 여기서 컴파일러는 JVM 의 명령어 세트를 CPU 명령어 세트로 변환하는 역할입니다.
Garabage Collector
Heap 메모리에 있는 오브젝트들을 정리하여 메모리를 확보하는 주체입니다. 주로 참조되지 않는 오브젝트(객체)들을 찾아서 정리합니다.
Java Native Interface
JNI 는 Java 외 다른 언어로 작성된 다른 프로그램을 실행시킬 수 있는 프레임워크입니다. 예를 들어, C, C+=, Assembly 등이 있습니다. Java는 실행결과를 Console로 내보낼 때나 OS 라이브러리와 상호작용할 때 JNI 프레임워크를 이용합니다.
JVM 메모리 구성
Heap 과 Method Area 는 여러 스레드에 공유되는 자원입니다.
Stack Area, PC Registers, Native Method Area 는 공유되지 않는 자원입니다.
Stack Area
스택 영역은 Thread가 새로 생성될 때 같이 영역이 할당됩니다. 그리고 메서드가 호출될 때 한 스택으로 저장됩니다. 호출된 메서드의 매개변수, 지역변수, 반환값, 연산 중간 계산값을 저장합니다. 스택구조로 First In Last Out / Last In First Out 입니다.
- 이 영역에는 메서드 내 지역변수 값들이 저장됩니다.
- 중간 계산 결과도 여기에 저장됩니다.
- Frame Datad은 Contant pool 과 Exception table 입니다.
- 매개변수,지역변수,반환값, 연순 중간 계산 값은 '프레임'으로 구성되어 스택에 쌓입니다.
PC(Program Counter) Register
각 스레드별로 영역이 할당되며, 현재 실행 중인 JVM instruction(명령어)이 저장됩니다.
Native Method Area
각 스레드별로 영역이 할당되며, Native 메서드 정보를 저장합니다. 자바 외 언어로 작성된 네이티브 코드를 위한 영역입니다.
Method Area
static 변수를 포함한 모든 클래스 레벨의 데이터를 저장합니다. 클래스, 인터페이스, 메소드, 필드, static 변수.
Heap Area
모든 오브젝트들을 저장합니다. new
키워드로 인스턴스를 생성하면 Heap 영역에 저장합니다. GC(Garbage Collection)는 이 Heap 영역에서 주로 활동합니다.
용어설명
- PC Register: Program Counter Register이다. 다음에 실행할 명령어의 주소를 가지고 있다. 명령어 포인터라고도 한다.명령어를 실행한 다음 명령어 포인터를 증가시켜 그 다음 명령어를 실행하도록 한다.
참고자료
- https://brucehenry.github.io/blog/public/2018/02/07/JVM-Memory-Structure/
- https://steady-coding.tistory.com/305
- 다이어그램
- https://www.javatpoint.com/jvm-java-virtual-machine
추가로 알아볼 정보
- Garbage Collection 작동방식과 효율적으로 사용하는 법
'공부노트 > 자바' 카테고리의 다른 글
OOP 설계 실습 (0) | 2022.03.26 |
---|---|
OOP(Object Oriented Programming)와 SOLID 원칙 (0) | 2022.03.19 |
Java는 Call By Reference가 없다. Object 참조만 있을 뿐. (0) | 2021.11.21 |