728x90
본 게시글은 백기선 님의 live-study 과제를 수행하면서 작성한 글입니다.
JVM이란 무엇인가?
JVM이란 Java Virtual Machine 자바 가상 머신의 줄임말입니다. 여기서 가상 머신이란 넓은 의미에서 소프트웨어로 구현된 하드웨어를 뜻하는 용어이다. 자바로 작성된 프로그램들은 JVM에서 실행되기 때문에 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요합니다.
일반적인 애플리케이션은 OS를 거쳐 하드웨어로 전달되는데 비해 자바 애플리케이션은 JVM을 거쳐야 하기 때문에 속도가 느리다는 단점을 가지고 있었습니다. 그러나 최근엔 바이트코드를 기계어로 바로 변환해주는 JIT컴파일러가 적용되어 속도의 격차를 많이 줄였습니다.
일반적인 애플리케이션은 다른 OS에서 실행하려면 해당 OS에 맞게 프로그램을 변경해야합니다. 하지만 자바 애플리케이션은 JVM을 통해서 실행되기 때문에 OS와 하드웨어에 독립적이어서 프로그램의 변경 없이 JVM을 설치할 수 있는 OS라면 어디서든 실행이 가능합니다.
컴파일 및 실행과정
- 아래와 같은 자바 코드를 작성합니다.
public class Hello {
public static void(String[] args) {
System.out.println("Hello World!");
}
}
- 자바 컴파일러의 javac 명령어를 통해 바이트코드(.class)를 생성합니다.
- 클래스 로더에 의해 생성된 .class파일들이 JVM으로 로딩됩니다.
- 로딩된 class 파일들은 실행 엔진을 통해 기계어로 해석됩니다.
- 해석된 기계어는 Runtime Date Areas에 배치되어 실질적인 수행이 이루어지게 됩니다.
JVM 구성 요소
출처 : https://asfirstalways.tistory.com/158
- Class Loader
- JVM내로 .class 파일을 로드하고, 링크를 통해 배치하는 작업을 수행합니다.
- jar 파일 내에 저장된 클래스들을 JVM에 탑재하고, 사용하지 않는 클래스들은 삭제합니다.
- 자바는 동적 로딩을 지원하여 실행 시에 모든 클래스가 로딩되는 것이 아니라 필요한 시점에 클래스를 로딩하여 사용합니다. 이 역할을 클래스 로더가 수행합니다.
- Execution Engine : 클래스 로더가 JVM내의 Runtime Data Areas에 바이트코드를 배치시키고, 실행 엔진에 의해서 바이트코드가 기계어로 변환된다. 실행 엔진의 종류에는 Interpreter와 JIT Compiler가 있습니다.
- Interpreter : 바이트코드를 한 줄씩 실행하여 속도가 느립니다.
- JIT(Just In Time) : 인터프리터 방식의 단점을 보완하기 위해 도입된 것으로, 인터프리터 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고, 이후에는 더 이상 인터프리팅 하지 않고 네이티브 코드로 직접 실행하는 방식입니다. 네이티브 코드는 캐시에 보관하기 때문에 한 번 컴파일 된 코드는 빠르게 수행됩니다. 하지만 JIT컴파일러가 컴파일하는 과정은 바이트코드를 인터프리팅 하는 것보다 훨씬 오래걸리기 때문에 한 번만 실행되는 코드라면 컴파일하지 않고 인터프리팅 하는 것이 유리합니다. 따라서 JIT 컴파일러를 사용하는 JVM들은 내부적으로 해당 메서드가 얼마나 자주 수행되는지에 따라 컴파일을 수행합니다.
- Garbage Collector : Heap 메모리 영역에 생성된 객체들 중에 참조되지 않은 객체들을 제거하는 역할입니다.
- Runtime Data Area : 프로그램을 수행하기 위해 OS으로부터 할당받은 메모리 공간으로써 크게 5가지 영역으로 구분됩니다.
- Method Area : Constant pool과 필드 정보, 메서드 정보 등 클래스와 인터페이스에 관련된 정보가 저장되는 영역입니다.
- Heap Area : 인스턴스 변수가 생성되는 공간으로 프로그램 실행 중 생성되는 인스턴스는 모두 이 곳에 생성됩니다.
- Stack Area : 메서드가 호출되면, 스택에 메서드를 위한 메모리가 할당되며, 메서드가 작업을 수행하는 동안 지역변수, 매개변수, 리턴 값 등을 저장하기 위해 사용됩니다.
- PC Register : 스레드가 시작될 때마다 생성되는 영역으로 스레드마다 하나씩 가지고 있다. 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있어 이것을 이용해 스레드를 돌아가면서 수행합니다.
- Native Method Stack : 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다.
JRE와 JDK
- JRE(Java Runtime Environment) : 자바 프로그램을 실행시키는 역할을 하는 것으로 필요한 라이브러리 및 기타 필수 파일을 가지고 있습니다.
- JDK(Java Development Kit) : java, javac 등을 포함한 자바 소프트웨어 키트이다. JDK안에는 JRE도 같이 포함되어 있습니다.
추가
JIT 컴파일러 - 컴파일 타임이 아닌 런타임에 관련된 것.
- 인터프리터는 바이트코드를 라인 단위로 기계어로 번역해서 실행하는데
- JIT은 인터프리터와 함꼐 실행되면서 자주 실행되는 코드라고 판단되면 해당 코드를 기계어로 변환해서 캐싱(JVM 내부)해놓고 재사용한다.
바이트코드 - 바이트 코드 X -> 띄어쓰기하면 안된다.
- 명령어 하나당 1Byte여서 바이트코드라고 불린다.
- 상위버전의 자바 컴파일러에서 생성된 바이트코드는 하위버전의 자바에서 실행할 수 없다.
참고 자료
'자바 > 스터디' 카테고리의 다른 글
[자바 스터디] 5주차 과제 - 클래스 (0) | 2020.12.17 |
---|---|
[스터디] JUnit5 자바 단위 테스트 프레임워크 (0) | 2020.12.14 |
[자바 스터디] 4주차 과제 : 제어문 (2) | 2020.12.11 |
[자바 스터디] 3주차 과제 : 연산자 (0) | 2020.12.01 |
[자바 스터디] 2주차 과제 : 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.21 |
댓글