[학습 주제]
JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.
[학습 목표]
자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기
[학습 내용]
- JVM이란 무엇인가
- 컴파일 하는 방법
- 실행하는 방법
- 바이트코드란 무엇인가
- JIT 컴파일러란 무엇이며 어떻게 동작하는지
- JVM 구성 요소
- JDK와 JRE의 차이
JVM이란 무엇인가
1. JVM의 정의
- Java Virtual Machine으로, 자바를 실행하기 위한 가상 기계(컴퓨터)
2. Java의 특징
- OS에 종속적이지 않고 실행되기 위해서는 OS 위에서 Java를 실행 시킨 것이 JVM
-> OS에 종속 받지 않고 CPU가 Java를 인식 및 실행할 수 있게 하는 가상 컴퓨터
컴파일 과정
- '컴파일(Compile)'이란, 개발자가 작성한 소스코드를 바이너리 코드로 변환하는 과정
- Java 소스코드(*.java)는 CPU가 인식하지 못하므로 기계어로 컴파일을 해주어야 함.
- Java는 이 JVM이라는 가상 머신을 거쳐 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일 되지 않고,
-> JVM이 인식할 수 있는 Java bytecode(*.class)로 변환됨
1) . java 파일 ---- java Compiler ----> . class(Java ByteCode)
- 변환된 Byte Code: 기계어 X -> OS에서 바로 실행 X
2) Bytecode ---- JVM ----> 기계어 -> OS가 bytecode 이해 가능
-> Byte Code가 JVM 위에서(JVM의 역할 덕분에) OS 상관없이 실행 가능
-> OS에 종속적이지 않고, java 파일 하나만으로 어느 디바이스든 JVM 위에서 실행 가능
실행하는 방법
메모장 등을 통해 Main.java 파일을 생성하여 코드 작성
-> 해당 파일을 저장한 경로에서 [ javac Main.java ] 명령어 입력을 통해 컴파일
-> Main.class 파일 생성
-> [ java Main ] 입력을 통한 실행
+ 컴파일과 빌드의 차이
컴파일(Compile)
1) 컴파일이란, 개발자가 작성한 소스코드를 목적 파일로 변환해주는 과정이며, 빌드의 일부분이다.
- 컴퓨터가 이해할 수 있는 기계어로 변환하는 작업이며,
- 이러한 작업을 해주는 프로그램 = 컴파일러(Compiler)라고 한다.
2) Java에서는, 컴파일을 할 경우 JVM에서 실행 가능한 Byte Code 형태의 class 파일이 생성된다.
- .java 라는 자바 클래스 파일 -> .class 라는 클래스 파일 생성
빌드(Build)
1) 소스코드 파일을 실행 가능한 소프트웨어 산출물로 만드는 일련의 과정이다.
- 빌드 단계중 컴파일이 포함 -> 컴파일은 << 빌드의 부분집합
2) 빌드 과정을 도와주는 도구 = 빌드 툴(Build Tool)
Ex) Ant, Maven, Gradle
3) 빌드 툴 제공 기능
Ex) 전처리(PreProcessing), 컴파일(Compile), 패키진(Packaging), 테스팅(Testing), 배포(Distribution)
바이트 코드란 무엇인가
1. 바이트코드(bytecode)의 정의
- 바이트코드는 JVM이 이해할 수 있는 저수준 언어
- .java 파일 ---- Compile ----> .class 파일 = 바이트코드로 구성
- 이때, 기존 언어의 컴파일 결과로 생성되는 오브젝트 파일(.obj)과 달리, 바이트코드(.class)는 Java가 설치된 모든 플랫폼의 JVM에서 실행 가능하다.
- 각 bytecode는 1byte 크기의 opcode로 이루어져 있다.
2. 바이트코드 확인 방법
방법 1. 명령어 입력
확인하고자 하는 java 파일에 대해 Open In Terminal을 클릭한 후
javap -c [클래스파일이름(.class file)]
javap 명령은 클래스 파일의 '필드, 생성자, 메소드'를 출력한다.
방법 2. IntelliJ에서 빌드 후 확인 방법
java 코드 빌드 후 -> 확인하고자 하는 java 파일 선택 후 View > Show Bytecode
+ bytecode를 디컴파일한 결과 확인 방법
빌드 후 build > classes > 파일경로 > .class 클릭으로 IntelliJ에서 디컴파일한 코드 확인 가능
3. 바이트코드 용도
(1) 프로그램 분석
- 코드에서 버그를 찾는 툴
- 코드 복잡도 계산
(2) 클래스 파일 생성
- 프록시
- 특정 API 호출 접근 제한
- 언어의 컴파일러 만들기
JIT 컴파일러란 무엇이며, 어떻게 동작하는지
1. JIT 컴파일러(Just-In-Time Compiler)의 정의
- JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러
- JIT 컴파일러는 인터프리터 방식의 단점을 보완하기 위해 도입되었다.
2. 인터프리터 방식과 단점
- 인터프리터는, 명령어를 하나씩 실행하는 방식
- 각각의 명령어가 중복(중복 코드 존재)되는 경우에도 라인별로 실행되어 인터프리팅 되는 과정이 반복된다.
3. JIT 컴파일러의 동작 방식
- .java ---- Java Compiler(javac) ----> byte code ----JVM ----> 기계어 변환
- 여기서, JVM( << JRE)는 JIT 컴파일을 통해 바이트 코드를 기계어로 변환하는 것이다.
- 실행 시점에 인터프리터 방식으로 기계어 코드 생성 -> 캐싱(캐시에 보관) -> 동일한 부분 호출 시 캐싱해둔 코드 재사용 가능 -> 인터프리터 방식보다 빠르다.
JVM 구성요소
1. Class Loader(클래스 로더)
1) JVM 내로 클래스(. Class 파일)를 로드 -> 링크를 통해 배치 작업을 수행하는 모듈
2) Runtime 시에 동적으로 클래스 로드
3) Jar 파일 내 저장된 클래스들을 -> JVM 위에 탑재하고,
사용하지 않는 클래스들은 -> 메모리에서 삭제
-> 컴파일러 역할(특정 프로그래밍 언어로 쓰여 있는 문서를 -> 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램)
-> 자바는 동적 코드 -> 컴파일 타임 X, 런타임에 참조
-> 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크함
2. Execution Engine(실행 엔진)
- 클래스를 실행시키는 역할
- Class Loader가 JVM 내의 런타임 데이터 영역에 바이트 코드 배치 -> 실행 엔진에 의해 실행됨.
(1) Interpreter(인터프리터)
- 실행 엔진은 Java byte code를 명령어 단위로 읽어 실행
- 한 줄씩 수행되어 느리다.
(2) JIT(Just-In-Time)
- 인터프리터 방식으로 실행하다가 -> 절절한 시점에, byte code 전체를 컴파일하여 기계어로 변경
-> 이후에는, 더 이상 인퍼프리팅 X, 기계어로 직접 실행하는 방식
(3) Garbage Collector
- 더 이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제한다.
* 다른 게시글에 해당 내용 상세 기재
3. RunTime Data Area(런타임 데이터 영역)
- 프로그램 수행을 위해 OS에서 할당받은 JVM의 메모리 공간
* 다른 게시글에 해당 내용 상세 기재
JDK와 JRE의 차이
JDK
1. JDK(Java Development Kit)의 정의
- JDK는 Java 애플리케이션을 만드는 데 사용되는 소프트웨어 개발 환경으로, Java용 SDK(Software Development Kit)
- Java 프로그램을 코드화하고, 실행하는 데에 사용
2. JDK와 JRE
- JDK에는 Java 프로그램을 작성하는데 필요한 도구(Kit)와 이 프로그램을 실행하는데 필요한 JRE가 포함
JRE
1. JRE(Java Runtime Enviroment)의 정의
- JRE는 컴파일된 Java 프로그램을 실행하는데 필요한 패키지
Ex) JVM(Java Virtual Machine), Java class library(자바 클래스 라이브러리), Java command(자바 명령) 및 기타 인프라
- JRE = 환경 -> java 관련 파일이 있는 디렉토리
2. JRE에 포함되어 있는 폴더와 파일
(1) bin/ : java 실행 프로그램 포함 디렉토리
(2) conf/ : 사용자가 편집할 수 있는 구성 파일(configuration files) 디렉토리
(3) lib/ : 여러가지 supporting 파일 디렉토리
Ex) .jar 구성 파일, 속성 파일, 글꼴, 번역, 인증서 등 java의 모든 trimming
Ex) Java 표준 라이브러리의 .class 파일을 포함하는 모듈
JDK와 JRE의 차이
- JDK는 Java 프로그래밍을 위한 기능을 제공
- JRE는 Java 프로그램 실행 환경을 구성
-> JDK는 JRE를 포함하고 있다.
-> JVM이 JRE에 속해있으므로, JRE가 설치되어 있는 환경에서는, Java 프로그램을 어디에서든 실행 가능하다.
-> Java 프로그램 실행만, 하는 경우라면 JRE만 설치하면 되지만, Java 프로그래밍을 할 것이라면 JDK를 설치해야 한다.
* JDK >> JRE >> JVM
'Programming > Java' 카테고리의 다른 글
[Java] 가비지 컬렉션(Garbage Collection) (0) | 2022.01.14 |
---|---|
[Online Study 2주차] 자바 데이터 타입, 변수, 그리고 배열 (0) | 2022.01.13 |
[Java] 변수 종류 - 클래스 변수 / 인스턴스 변수 / 지역 변수 (1) | 2022.01.13 |
[Java] 접근 제어자(public, protected, default, private) (0) | 2021.10.01 |
[Java] static (0) | 2021.10.01 |