티스토리 뷰
JVM이란 무엇인가
자바 가상 머신(Java Virtual Machine, JVM)은 자바 바이트코드를 실행 할 수 있는 기계이다.
자바가 내세우는 Write once, run anywhere (한번만 작성하면 어디서든 실행 가능) 가 의미하는 것은 바이트코드로 변환된 코드는 플랫폼(Window, Mac, Linux)에 상관없이 JVM에서 실행이 되기 때문이다.
JVM에서 바이트코드를 변환한 네이티브코드(기계어)는 OS에 특화된 코드로 변환되기 때문에 JVM 자체는 플랫폼 자체에 종속적이다.
JVM은 자바 가상 머신이지만 자바에만 의존 하는 것은 아니다. 바이트코드만 만들어 낼 수 있으면 JVM이 실행할 수 있기 때문에 코틀린이나 groovy 또는 scalar 언어들도 JVM위에서 실행할 수 있다.
컴파일 하는 방법
javac [.java 파일]
- javac 명령어로 컴파일 하면 .class 파일이 생성된다.
실행하는 방법
java [.class 파일]
사실 요즘 이렇게 하는 사람들은 없고 좋은 IDE들이 많기 때문에 IDE들이 알아서 컴파일하고 실행시켜준다.
바이트코드란 무엇인가
바이트코드는 기계어가 아니다. 가상 머신에 의해서 기계어로 손쉽게 변환할 수 있는 코드이다.
.java 파일을 컴파일 했을 때 나오는 코드이다.
JVM이 이해할 수 있는 언어로 변환된 자바 소스코드
자바 바이트코드의 확장자는 .class 파일이다.
JIT 컴파일러란 무엇이며 어떻게 동작하는지
JIT 컴파일러는 자바 컴파일러가 생성한 자바 바이트코드를 런타임에 바로 기계어로 변환하는 데 사용
JIT 컴파일러는 바이트코드를 읽어 빠른 속도로 기계어(Native code)를 생성한다.
기계어 변환은 코드가 실행되는 과정에서 실시간으로 일어나며 전체 코드의 필요한 부분만 변환한다.
기계어로 변환된 코드는 캐시에 저장되기 때문에 재사용시 컴파일을 다시 할 필요가 없다.
JVM 구성 요소
클래스로더
- 클래스 로더는 클래스 파일을 로딩하고, 연결하고, 초기화 하는 기능을 한다.
- 로딩(Loading)은 클래스를 사용 하려고 하면 자바 클래스로더가 해당 클래스를 메모리에 로드하는 과정이다.
- 연결(Linking)은 클래스 파일을 검증하고 연결하는 과정이다.
- 초기화(Initialization)은 모든 정적 변수들이 초기화 되고 변수에 할당된다.
JVM 메모리 영역 (Runtime Data Area)
- Method area는 클래스 수준의 정보(풀 패키지 경로, 클래스 이름, 부모 클래스 이름, 변수 정보 등)를 저장한다. 전역변수도 포함되고 JVM에서 오직 하나의 영역만 존재하고 공유할 수 있다.
- Heap 영역은 new 키워드로 생성된 객체(인스턴스)와 배열이 생성되는 영역이다.
- Stack 영역은 스레드마다 런타임 스택을 만들고 메서드 호출을 스택 프레임에 쌓는다. 자바스크립트를 실행할 때 호출스택이 쌓이는 것과 같은 것 같다. 스레드마다 하나씩 만들어진다.
- PC Register는 현재 스택 프레임 위치가 어디인지 가리키는 포인터이다.
- Native Method Stack은 네이티브 메서드를 실행할 때 생성되는 별도의 스택이다.
Execution Engine
- 인터프리터(Interpreter)는 바이트코드를 한줄씩 실행하여 해석한다. 단점은 여러번 하나의 메서드를 호출할 경우 매번 해석을 요청해야 하기 때문에 비효율적이다.
- JIT(Just-In-Time compiler)는 인터프리터의 효율을 증가하는 데 이용한다. 전체 바이트 코드를 컴파일하고 네이티브 코드를 변경하여 메소드의 반복 호출을 확인할 때마다 JIT는 직접 네이티브 코드로 제공함으로써 재해석을 요구하지 않으므로 효율성이 증가한다.
- 가비지 컬렉터(Garbage Collector)는 참조되지 않는 객체를 자동으로 소멸시켜준다.
JNI(Java Native Method Interface)
- Native Method Libraries와 상호작용하고 실행에 필요한 네이티브 라이브러리 (C언어, C++)을 제공하는 인터페이스이다.
- 자바에서 C언어 또는 C++, 어셈블리어로 작성된 함수를 사용할 수 있는 방법을 제공한다.
Native Method Libraries
- 네이티브 라이브러리(C, C++)의 모음이다.
JDK와 JRE의 차이
JRE는 (Java Runtime Environment) 로 자바 프로그램을 실행시켜주는 도구
JRE의 목적은 자바를 실행할 수 있는 환경만 제공해준다.
즉, 자바 프로그램을 실행하려는 목적만 있으면 JRE만 설치하면 된다.
JDK는 (Java Development Kit) JRE를 포함하고 개발에 필요한 툴을 가지고 있다.
JDK는 개발툴 까지 포함한 도구이기 때문에 개발을 하고 실행을 하려면 JRE가 필요하기 때문에 JRE를 포함한다.
참조
https://www.inflearn.com/course/the-java-code-manipulation
https://mygumi.tistory.com/115
- Total
- Today
- Yesterday
- Linux
- mybatis config
- Spring
- springboot
- rocky
- maven
- LocalDate
- config-location
- k8s
- elasticsearch
- Mac
- docker
- Github Status
- JavaScript
- 북리뷰
- jQuery
- 베리 심플
- Java
- oracle
- Kotlin
- svn
- input
- Bash tab
- localtime
- LocalDateTime
- mybatis
- intellij
- window
- 오라클
- Spring Security
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |