korean IT student

[Java-Live-Study] 1주차 - JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 본문

back-end/JAVA

[Java-Live-Study] 1주차 - JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가

현창이 2021. 8. 3. 17:24

목표

자바 소스 파일(.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 컴파일을 통해 기계어로 변환한다.

출처: https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/

5. JVM구성 요소

출처: https://jeong-pro.tistory.com/148

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의 차이

 

두개의 키워드를 아래와 같이 간단하게 요약할 수 있다.

출처 :  https://www.inflearn.com/course/the-java-code-manipulation

 

  • 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

Comments