Java Virtual Machine의 약자이며 바이트 코드를 실행시키기 위한 가상머신
"Write once, Run anywhere" 독립적 플랫폼이며 실행 가능한 환경이면
실행이 가능.
자바 바이트코드(.class 파일)를 OS에 특화된 코드로 변환하여 실행.
스택 기반의 가상 머신
가비지 컬렉션 사용
- 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서
필요없게 된 영역을 해제하는 기능이다.
특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이전 표현법
H/W 가 아닌 S/W에 의해 처리되기 때문에 기계어보다 추상적이다.
역사적으로 바이트코드는 대부분의 명령 집합이 0개 이상의 매개 변수를 갖는 1바이트 크기의 명령 코드였기 때문에 바이트코드라 불리게 되었다.
한번에 하나의 명령어를 읽은 후 실행 (높은 이식성을 갖는다)
또 다른 형태로서 실시간 번역기 또는 저스트 인 타임(Just-In-Time,JIT) 컴파일러라 불리는 시스템은 실행 중에 필요에 따라서 바이트코드를 기계어로 번역한다.
클래스로더 / 런타임 데이터 영역 / 실행 엔진 / JNI / 네이티브 메소드 라이브러리
자바 클래스를 자바 가상 머신으로 동적 로드하는 자바 런타임 환경의 일부
각 자바의 클래스는 클래스 로더에 의해 로드.
자바 프로그램들은 외부 라이브러리들을 이용하거나 최소한 수많은 라이브러리들의 한부분 으로 구성.
JVM 시작시 3개의 클래스 로더들이 사용
1.부트스트랩 클래스 로더 (핵심 자바 라이브러리들을 부름)
2.확장 클래스 로더 (확장 디렉터리 또는 기타 디렉터리에 코드를 로드)
3.시스템 클래스 로더 (CLASSPATH 환경 변수에 매핑)
JVM이 프로그램을 수행하기 위해 OS로부터 할당받는 메모리 영역
Runtime Data Area은 5가지로 구분된다.
PC Register / JVM stack / Native Method stack / Heap / Method Area
좌측 3개의 영역은 Thread 별로 생성되고 우측 2개의 영역은 모든 Thread를 공유한다.
PC Register
JVM stack
Native Method stack
Heap
Method Area
JIT컴파일 또는 동적 번역은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법
전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두 가지가 있는데, 인터프리트 방식과 정적 컴파일 방식으로 나눈다.
인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행한다. 반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.
인터프리터의 단점을 보완하기 위해 도입된 방식으로 반복되는 코드를 발견하여 바이트 코드 전체를 컴파일하여 네이티브 코드로 변경하고 이후 해당 매서드를 더 이상 인터프리팅 하지 않고 캐싱해 두었다가 네이티브 코드(C,C++,어셈블리어로 구성된 코드)로 직접 실행하는 방식.
자바가 다른 언어로 만들어진 어플리케이션과 상호 작용할 수 있는 인터페이를 제공하는 프로그램
c ,c++ 로 작성된 라이브러러
만일 헤더가 필요하면 JNI는 이 라이브러리를 로딩해 실행한다.
래퍼런스
https://inpa.tistory.com/entry/JAVA-☕-JVM-내부-구조-메모리-영역-심화편#자바_가상_머신jvm의_구조
https://namu.wiki/w/JDK
https://namu.wiki/w/JVM