728x90
✍️ 학습 목표
- JVM
- 컴파일 방법
- 실행 방법
- 바이트코드
- JIT 컴파일러
- JVM 구성 요소
- JDK와 JRE
📌JVM이란?
Java Virtual Machine의 약자로 자바를 실행하기 위한 가상 머신이다. Java는 완전한 기계어가 아니고 바이트 코드라서 해석하고 실행할 수 있는 가상의 OS가 필요하다. 이 역할을 해주는 것이 JVM이다.
✔️ JVM의 기능
- 자바 프로그램이 어느 환경에서도 실행될 수 있게 한다.
- 프로그램 메모리를 관리하고 최적화한다.
- JVM는 '가비지 컬렉션'이란 프로세스를 통해 메모리를 관리한다. 이 가비지 컬렉션은 이름에서 알 수 있듯이 사용되지 않는 메모리를 정리한다. 따라서, JVM이 메모리를 효율적으로 관리하고 최적화한다는 것이다.
- Java는 OS에 독립적이지만, JVM은 OS에 독립적이지 못하다.
- 따라서 OS에 맞는 JVM을 사용해야 한다는 특징이 있다.
📌컴파일 방법
Java 컴파일러는 JDK를 설치하면 JDK의 bin 폴더 속 javac.exe라는 실행 파일 형태로 설치된다.
기존에 작성한 자바 소스파일(*.java)을 터미널 창에서 javac 명령어를 통해서 컴파일할 수 있다.
C:\Users\gmlwh\Desktop>javac test.java
컴파일 완료 시 같은 디렉토리에 .class파일이 생성된다.
💡 참고 (Java 컴파일 과정)
- 개발자가 Java로 코드를 작성하면 자바 소스코드(*.java)가 생성된다.
- JVM 때문에 바로 기계어로 컴파일하지 않고 JVM이 이해할 수 있는 자바 바이트코드(*.class)로 변환된다.
- 바이트코드는 JVM의 클래스 로더에게 전달되고 로더는 필요한 클래스들을 로딩 및 링크하여 메모리에 올린다.
- 실행 엔진이 메모리에 올라온 바이트 코드를 명령어 단위로 가져와서 실행한다.
📌실행 방법
javac 명령어로 생성된 자바 바이트코드(*.class)를 java 명령어로 실행시킬 수 있다.
C:\Users\gmlwh>cd Desktop
C:\Users\gmlwh\Desktop>java test
java 명령어는 사실 JVM을 실행시키는 명령어이다.
📌바이트코드란?
자바 가상 머신(JVM)이 이해할 수 있는 자바 소스코드(*.java)가 변환된 코드이다.
또한, 변환된 코드의 명령어 크기가 1바이트라서 바이트코드라고 불리고 있다. 확장자는 .class이다.
📌JIT 컴파일러란?
- 바이트코드가 변경될 때 인터프리터와 JIT 컴파일러를 이용해서 변경된다.
- JIT 컴파일러의 JIT는 Just-In-Time의 약자로 이 컴파일러는 적절한 시간에 바이트코드 전체를 컴파일해서 인터프리터의 단점을 보완하기 위해서 만들어졌다.
- 무조건 컴파일하는 것이 빠른 것이 아니고 무조건 인터프리팅하는게 빠른 것이 아니기 때문에 JVM 내부 메서드가 수행 빈도를 체크해 일정 정도를 넘길 시 컴파일한다.
📌JVM 구성요소
JVM은 크게 3가지로 구성되어있다.
✔️ 클래스 로더 (Class Loader)
- Java의 클래스들은 런타임에 처음 참조될 때 해당 클래스는 로드되고 링크된다.
- 이 동적 로드를 클래스 로더가 담당한다.
✔️ 실행 엔진 (Execution Engine)
- 말 그대로 실행시키는 역할이다.
- 클래스 로더가 메모리에 바이트코드를 배치시키면 이 코드를 실행 엔진이 실행시킨다.
- 인터프리터, JIT 컴파일러, GC (garbage collector)로 구성되어있다.
✔️ 런타임 데이터 영역 (Runtime Data Area, = 메모리)
- JVM의 메모리 영역으로, 프로그램을 수행하기 위해 OS로부터 할당받은 공간이다.
📌JDK vs JRE
✔️ JDK (Java Development Kit) : JRE + 개발 툴
- JRE와 개발에 필요한 툴들 합친 것을 의미.
- Java 11부터 오라클에서 JDK만 제공한다.
✔️ JRE (Java Runtime Environment) : JVM + 라이브러리
- Java 애플리케이션을 실행할 수 있도록 구성한 배포판.
- 개발 관련 도구는 포함하지 않는다.
'언어 공부 > Java' 카테고리의 다른 글
[Java] Java의 상속 (2) | 2022.08.25 |
---|---|
[Java] Java의 클래스 (0) | 2022.08.17 |
[Java] Java 제어문 (0) | 2022.08.16 |
[Java] Java의 연산자 (0) | 2022.08.15 |
[Java] Java의 데이터 타입, 변수 그리고 배열 (0) | 2022.08.12 |
댓글