티스토리 뷰
1주차 과제
JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.
목표
자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.
학습내용
1. JVM이란 무엇인가
자바 가상 기계(Java Virtual Machine)로, 자바 프로그램은 완전한 기계어가 아닌, 중간 단계의 바이트 코드이기 때문에 이것을 해석 및 실행할 가상의 운영체제가 필요하다.
즉, 쉽게 말하면 "자바를 실행시키는 가상의 기계"라고 할 수 있다.
바이트 코드는 모든 JVM에서 동일한 실행 결과를 보장하지만, JVM은 운영체제에 종속적이다.
기계어
CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰인 컴퓨터 언어를 통틀어 말한다.
2. 컴파일 하는 방법
먼저, 컴파일에 대한 설명을 하려 한다.
컴파일이란, 우리의 언어와 컴퓨터의 언어는 다르다. 그렇기 때문에 컴퓨터가 이해할 수 있는 언어로 바꿔주는 일종의 통역사가 바로 컴파일이다.
ex) Hello.java 코드로 실행하는 경우
javac "소스 코드"
javac Hello.java
3. 실행하는 방법
자바 명령어를 통해 실행할 수 있다.
java 명령어
java Hello
4. 바이트코드란 무엇인가
바이트코드(Bytecode)
특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.
즉, 가상머신이 이해할 수 있는 0과 1로 구성된 이진 코드를 의미한다.
5. JIT 컴파일러란 무엇이며 어떻게 동작하는지
Just In Time의 약어로, 프로그램을 실제 실행하는 실시간 기계어로 번역하는 컴파일 기법이다.
예를 들어 Hello.java 소스 코드를 생성한 가정에서 순서를 적어본다.
1) Hello.java 소스코드 작성
2) Java 컴파일러가 바이트코드(Hello.class)로 변환
3) JVM에서 각 운영체제에 맞는 기계어로 번역하여 전달
즉, JIT 컴파일러는 같은 코드를 매번 해석하지 않고 실행할 때 컴파일을 하면서 코드를 캐싱해버린다. 이로 인하여 인터프리터의 속도를 개선할 수 있다.
6. JVM 구성 요소
JVM에는 다음과 같은 것이 포함이 되어있다.
1) Class Loader
JVM내로 클래스(.class 확장자 파일)를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다. 자바는 동적 코드, 컴파일 타임이 아니라 런타임에 참조한다. 즉, 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크한다는 것이다.
2) Execution Engine
클래스를 실행시키는 역할이다. 클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것을 실행 엔진에 의해 실행된다. 실행 엔진은 바이트코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경한다.
3) Interpreter
실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다. 하지만 이방식은 인터프리터 언어의 단점을 그대로 갖고 있다. 한 줄씩 수행하기에 느리다는 의미다.
4) Just In Time
인터프리터 방식의 단점을 보완하기 위해 도입된 JIT 컴파일러다. 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 네이티브 코드로 변경하고, 이후에는 인터프리팅 하지 않고 네이티브 코드로 직접 실행하는 방식이다. 네이티브 코드는 캐시에 보관하기 때문에, 한 번 컴파일된 코드는 빠르게 실행이 된다. 따라서 JIT 컴파일러를 사용하는 JVM들은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고, 일정 정도를 넘을 때에만 컴파일을 수행한다.
5) Garbage Collector
동적으로 할당된 메모리 중 사용되지 않는 메모리를 반환한다.
7. JDK와 JRE의 차이
JDK(Java Development Kit)
JDK는 자발 개발 키트로 자바 개발도구로써 자바를 이용해 개발하는데 필요한 프로그램들이 포함이 되어있다.
JDK = JRE + 개발에 필요한 도구
JRE(Java Runtime Environment)
JRE는 자바 런타임 환경으로 프로그램 실행에 필요한 자바 가상 기계(JVM), 라이브러리 API만 포함되어 있다.
JRE = JVM + 표준 클래스 라이브러리
참고
책 : 이것이 자바다
|
JVM아키텍처 : asfirstalways.tistory.com/158
위 이미지는 책에 있는 것을 참고로 제작하였습니다.
새로 시작하는 프로젝트가 자바 기반 스프링으로 구성이 된다고 하여, 스터디를 참가하게 되었다.
평소 개발자들 사이에서도 대략적인 단어들이 좀 있는 것 같아 도전하게 되었지만,
역시 쉽지 않다.
하지만 포기는 없으니 완주를 위해 계속 달리려고 한다.
'Back-End > Java' 카테고리의 다른 글
4주차 과제 1. 선택문 (0) | 2021.01.05 |
---|---|
3주차 과제 : 연산자 (0) | 2020.12.24 |
2주차 과제 : 자바 데이터 타입, 변수 그리고 배열에 대한 정리 (0) | 2020.12.23 |
이클립스를 설치해보자 (0) | 2020.12.22 |
자바 개발 환경을 구축해보자. (0) | 2020.12.19 |
- Total
- Today
- Yesterday
- Git
- node-sass
- 프로그래머스
- 리액트
- 재공부
- mongodb
- github
- CSS
- programmers
- 코딩테스트
- 배열
- 함수
- 리액트 유튜브
- 자바
- node.js
- 파이썬
- Coding Test
- java
- Switch
- node
- 노드
- javascript
- redux
- 리액트 썸네일
- array
- 뷰
- 자바스크립트
- 리덕스
- react
- Visual Studio Code
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |