일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 메서드
- spring
- 글로벌
- jsp
- Flutter
- nginx
- gradle
- keycloak
- ES6
- json
- jpa
- vue
- Docker
- SpringBoot
- lightsail
- 인텔리제이
- 에러
- aws
- 스프링
- 현장학습
- Keycloak 17.0.1
- java
- 맥길대학교
- jQuery
- vue.js
- 자바스크립트
- JavaScript
- 알고리즘
- REACT
- arraylist
- Today
- Total
korean IT student
[Java-Live-Study] 1주차 - JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 본문
목표
자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.
학습할 것
- JVM이란 무엇인가
- 컴파일 하는 방법
- 실행하는 방법
- 바이트코드란 무엇인가
- JIT 컴파일러란 무엇이며 어떻게 동작하는지
- JVM 구성 요소
- JDK와 JRE의 차이
1. JVM이란 무엇인가
Java Virtual Machine 의 줄임말 이며 Java Byte Code를 OS에 맞게 해석 해주는 역할을 합니다. Java compiler는 .java 파일을 .class 라는 Java byte code로 변환 시켜 줍니다. Byte Code 는 기계어가 아니기 때문에OS에서 바로 실행되지 않습니다. 이때 JVM은 OS가 ByteCode를 이해할 수 있도록 해석 해줍니다. 하지만 JVM의 해석을 거치기 때문에 c언어 같은 네이티브 언어에비해 속도가 느렸지만 JIT(Just In Time)컴파일러를 구현해 이점을 극복했습니다. Byte Code는 JVM 위에서 OS상관없이 실행된다. 이런 점이 Java의 가장 큰 장점이라고 할수 있습니다. OS에 종속적이지 않고 Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행 할 수 있습니다. JVM은 크게 Class Loader, Runtime Data Areas, Excution Engine 3가지로 구성
2. 컴파일 하는 방법, 실행하는 방법
cmd 창에서 자바 컴파일 하기
- javac main.java (class 파일 만들기)
- java main 또는 java main.class (파일 실행)
자바 컴파일 과정
- JDK에 포함되어있는 javac 라는 프로그램을 사용하여 자바 파일을 컴파일을 할 수 있습니다.
- IntelliJ, Eclipse 와 같은 통합 개발 환경(Integrated Development Environment, IDE) 나 terminal 환경에서 .java 파일을 생성한다. 그리고 build라는 작업을 통해 자바 컴파일러(javac)가 .java 파일을 JVM이 이해할 수 있는 바이트코인 .class파일로 바꿔준다.
- Class Loader를 통하여 바이트코드를 JVM내로 로드하고 Execution Engine에서 두 가지 방식을 활용(interpreter, JIT)하여 기계어로 바꿔준다.
3. 바이트코드란 무엇인가
바이트코드(Bytecode, portable code, p-code)는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다. 하드웨어가 아닌 소프트웨어에 의해 처리되기 때문에 보통 기계어 보다 더 추상적이다.
- Java에서 바이트코드는 Java 가상 머신인 JVM이 이해할 수 있는 언어로 변환된 Java 소스코드를 의미한다.
- Java 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드
- Java 바이트 코드의 확장자는 .class
- Java 바이트코드는 자바 가상 머신(Java Virtual Machine)만 설치되어 있으면, 어떤 운영체제에서 실행가능
4. JIT 컴파일러란 무엇이며 어떻게 동작하는 지
JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.
전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두 가지가 있는데, 인터프리트 방식과 정적 컴파일 방식으로 나눌 수 있다. 이 중 인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어(네이티브) 코드를 실행하며, 반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.
JIT 컴파일러는 두 가지의 방식을 혼합한 방식으로 생각할 수 있는데, 실행 시점에서 인터프리트 방식으로 기계어(네이티브) 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.
- 자바는 바이트코드로 한번 컴파일 하는 과정과, 바이트코드를 인터프리터 하는 방식 2가지를 진행
- 자바 컴파일러가 자바 프로그램 코드를 바이트코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 자바 가상 머신이 바이트코드를 JIT 컴파일을 통해 기계어로 변환한다.
5. JVM구성 요소
JVM은 크게 Class loader, Execution Engine, Runtime Data Areas, Garbage Collector으로 나누어집니다.
Class loader
- 자바 컴파일러에 의해 바이트코드로 변환된 클래스를 읽어들여 Runtime Data Area 에 적재하는 역할을 합니다.
Execution Engine
- Class Loader 에 의해 Runtime Data Area 에 적재된 클래스(바이트코드) 를 기계어로 변환하고 실행하는 역할을 합니다. 명령어는 Interpreter 방식으로 하나하나 실행되기도 하고, JIT(Just-In-Time) 에 의해 적절한 시간에 전체 바이트코드를 네이티브코드로 변환하여 실행되기도 합니다.
Runtime Data Areas
- JVM 의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
- 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack
Garbage Collector
- Garbage Collector(GC)는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.
- GC가 역할을 하는 시간은 정확히 언제인지를 알 수 없다. (참조가 없어지자마자 해제되는 것을 보장하지 않음)
- 또 다른 특징은 GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 모든 쓰레드가 일시정지된다.
- 특히 Full GC가 일어나서 수 초간 모든 쓰레드가 정지한다면 장애로 이어지는 치명적인 문제가 생길 수 있는 것이다.
Runtime Data Areas
Method Area
- 클래스 정보가 저장되는 공간입니다.
- 클래스의 메소드 정보가 저장되고, 맴버 변수의 이름과 타입, 메소드의 이름과 파라미터 그리고 리턴값이 저장되고, 각종 상수, static 메소드, final 클래스 변수 등이 저장됩니다.
Heap Area
- new 키워드에 의해 생성되는 클래스와 배열 등이 저장됩니다.
- Method Area 영역에 저장된 클래스만이 생성 가능하고, Garbage Collector 에 의해 사용되지 않는 클래스/배열이 제거됩니다.
Stack Area
- 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역입니다.
- int 와 같은 클래스 아닌 변수들은 이곳에 저장됩니다. Person p = new Person(); 와 같이 클래스를 생성할 경우, new 에 의해 생성된 클래스는 Heap Area 에 저장되고, Stack Area 에는 생성된 클래스의 참조인 p 만 저장됩니다.
- 클래스의 메소드를 실행할 때마다 스택이 생성됩니다.
- Method Area, Heap Area 를 제외한 영역들은 스레드간에 공유되지 않습니다.
PC Register
- 스레드가 생성될 때마다 생성되며, 현재 실행중인 주소와 명령을 저장합니다.
- 멀티 스레드가 동작할 때, 이곳의 정보를 이용해 여러 스레드를 동시에 실행할 수 있습니다.
Native Method Stack
- 자바 이외의 코드(JNI) 가 저장되는 공간입니다.
6. JDK와 JRE의 차이
두개의 키워드를 아래와 같이 간단하게 요약할 수 있다.
- JDK = JRE + @ (개발에 필요한 도구)
- JRE는 읽기 전용, JDK 읽기 / 쓰기 전용이라 생각 할 수 있다.
JDK
- JDK는 자바 개발도구(Java Development Kit)의 약자이다.
- JAVA로 된 언어를 컴파일하고 개발할 수 있도록 해주는 개발 환경의 세트를 의미한다.
- JDK는 JRE에서개발을 위해 필요한 도구(javac, java, visualVM 등)을 포함한다.
JRE
- JRE는 자바 실행환경(Java Runtime Environment)의 약자이다.
- JAVA를 개발할 필요는 없는데, 실행은 시켜줘야 하는 경우에는 꼭 JRE가 있어야 한다.
- JRE는 JVM이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을
참고
https://goodgid.github.io/Java-JDK-JRE/
https://jeong-pro.tistory.com/148
https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2
https://ko.wikipedia.org/wiki/JIT_%EC%BB%B4%ED%8C%8C%EC%9D%BC
'back-end > JAVA' 카테고리의 다른 글
[Java-Live-Study] 3주차 - 연산자 (0) | 2021.08.16 |
---|---|
[Java-Live-Study] 2주차 - 자바 데이터 타입, 변수 그리고 배열 (0) | 2021.08.04 |
JAVA- Convert Java Object to from JSON (0) | 2020.12.08 |
JAVA - 스트림(stream) (0) | 2020.12.06 |
JAVA - 람다식 (0) | 2020.12.06 |