티스토리 뷰
# 목표 - 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기
0. intro - Write Once, Run Everywhere
다른 프로그래밍 언어와 비교했을 때, 자바를 특색 있게 만드는 것은 하나의 자바 프로그램이 어떤 컴퓨터 기종에서도
실행이 가능하는 점이다. 실행 파일을 전혀 변경하지 않아도 된다. 즉, 다시 컴파일할 필요가 없다.
이렇게 자바가 다양한 종류의 컴퓨터에서 실행이 가능한 것은 "가상 기계" 개념 때문이다.
1. JVM이란 무엇인가
다른 프로그래밍 언어의 경우, 소스 코드가 컴파일러에 의하여 특정한 컴퓨터의 기계어로 변환되어서 특정 컴퓨터에서 실행된다. 그러나 자바 컴파일러는 특정한 컴퓨터를 위한 코드를 바로 생성하지 않는다. 대신에 가상적인 컴퓨터의 기계어인 바이트 코드(byte code)를 생성한다. 이 바이트 코드는 자바 가상 기계(Java Virtual Machine)라고 하는 소프트웨어에 의하여 한 줄씩 해석되면서 특정한 컴퓨터에서 실행된다. 즉, 자바 가상 머신(JVM)은 자바 바이트 코드를 실행할 수 있는 주체이다.
이렇게 두 단계로 나누어서 컴파일하고 실행하는 이유는 응용 프로그램들을 다시 컴파일하지 않아도 모든 컴퓨터에서 실행되도록 하기 위함이다. JVM만 가지고 있다면 어떤 바이트 코드도 다시 컴파일할 필요가 없이 JVM위에서 실행할 수 있다.
2. 컴파일 하는 방법
: .java -> .class 파일 생성
$ javac <options> <source files>
추가 > javac 의 옵션
1. -classpath path : 컴파일러가 필요로 하는 참조 클래스 파일들을 찾기 위해 파일 경로를 지정해준다.
2. -d directory : 클래스 파일을 생성할 루트 디렉터리를 지정한다.
3. -encoding encoding name : 소스 파일에 사용된 문자열 인코딩을 설정한다.
4. -g : 모든 디버깅 정보를 생성한다.
5. -verbose : 현재 어느 소스파일이 컴파일되고 있고, 어느 파일이 링크되고 있는지 그 정보를 출력한다.
6. -deprecation : 소스 코드내에서, 사용되어진 deprecated API의 위치를 출력한다.
7. -sourcepath path : 소스파일의 위치를 지정한다.
8. -target 자바버전 : 지정된 자바버전의 VM에서 작동되도록 그 버전에 맞는 클래스 파일을 생성한다.
3. 실행하는 방법
- .class파일 실행
$ java 소스파일
4. 바이트코드란 무엇인가
바이트 코드는 가상 기계(JVM)의 기계어라고 생각할 수 있다.
5. JIT 컴파일러란 무엇이며 어떻게 동작하는지
JIT(Just-In-Time) 컴파일은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.
전통적으로 컴퓨터 프로그램을 만드는 방법은 두 가지가 있는데, 인터프리트 방식과 정적 컴파일 방식으로 나눌 수 있다.
이 중 인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하며,
반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.
JIT 컴파일러는 두 가지의 방식을 혼합한 방식으로 생각할 수 있는데, 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.
즉, 자바 컴파일러가 자바 프로그램 코드를 바이트 코드로 변환한 다음, 실제 바이트 코드를 실행하는 시점에서 자바 가상 머신이 바이트 코드를 JIT 컴파일을 통해 기계어로 변환한다.
6. JVM 구성 요소
: Class Loader 가 바이트 코드를 JVM Memory에 로드하고, Execution Engine이 바이트 코드를 실행하는 구조이다.
7. JDK와 JRE의 차이
우리가 자바 프로그램을 개발하기 위해서는 자바 컴파일러가 있어야 한다. 일반적으로 자바 컴파일러와 디버깅 도구, 각종 유틸리티 등의 프로그램 개발 도구들을 JDK(Java Development Kit)라 부른다. JDK는 java.sun.com 에서 무료로 다운로드 받을 수 있다.
- JRE(Java Runtime Environment)
: JRE는 자바 프로그램을 실행하기 위한 라이브러리, 자바 가상 기계, 기타 컴포넌트들을 제공한다. 자바 프로그램을 실행만 하고 개발은 하지 않는 일반인들을 위한 환경이다.
- JDK(Java Development Kit)
: JDK는 JRE에 자바 프로그램을 개발하는데 필요한 컴파일러, 디버거와 같은 도구들을 추가한 것이다. JDK 안에 JRE가 포함되어 있음을 유의하자. 개발자는 JDK를 다운로드 받아야 한다.
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[JAVA] Call-By-Reference vs Call-By-Value / 인스턴스멤버 vs 정적멤버 / 자바 접근제한자 (0) | 2021.02.22 |
---|---|
[JAVA] 객체지향 개념 / Method vs Function / 클래스 (필드, 메소드, 생성자) (0) | 2021.02.21 |
[JAVA] 배열 복사하는 3가지 방법 / Shallow Copy vs Deep Copy (0) | 2021.02.19 |
[JAVA] Primitive Type vs Reference Type / 타입별 변수의 메모리 저장 위치 비교 / 열거 타입(Enumeration type) (0) | 2021.02.17 |
[JAVA] 자바 버전/ 기본 타입 / 타입변환(자동 vs 강제)/ JRE vs JDK (0) | 2021.02.16 |
- Total
- Today
- Yesterday
- @functools.singledispatch
- 정적멤버
- jre
- 익명자식객체
- 자바빌드도구
- method와 function
- dynamic-project
- os
- 자바스레드
- yarn start
- Git
- 자바스크립트Promise
- ES6
- 인스턴스멤버
- 백준
- 사용자정의예외클래스
- @functools.wraps
- jdk
- 클래스와객체
- 메이븐 저장소
- nunjucks
- es6모듈
- sequelize.fn
- @functools.lru_cache
- 백준2206 파이썬 풀이
- nodejs
- 자바스크립트Call-back
- 생성자필드메소드
- java
- 객체지향개념
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |