JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

Yeonjun Kim·2021년 8월 12일
0
post-thumbnail

개요

본 포스팅은 백기선님의 자바 스터디의 과제입니다.

1. JVM이란 무엇인가

Java Virtual Machine의 줄임말 이며 '자바를 실행하기 위한 가상 컴퓨터'이다.
Java Byte Code를 OS에 맞게 해석 해주는 역할을 합니다.
일반적인 애플리케이션은 OS종속적이라서, OS에 맞게 변경해야 하는 번거로움이 있다. 하지만, Java 애플리케이션은 JVM하고만 상호작용 하기 때문에 OS와 하드웨어에 독립적이라 다른 OS에서도 프로그램의 변경없이 실행이 가능하다.


2. 컴파일 하는 방법

javac Hello.java


3. 실행하는 방법

java Hello


4. 바이트코드란 무엇인가

바이트코드의 정의는 다음과 같다.

바이트코드(Bytecode)는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다. 하드웨어가 아닌 소프트웨어에 의해 처리되기 때문에, 보통 기계어보다 더 추상적이다.

즉, Java에서 바이트코드는, Java Source Code를 Complie하여 생성된 JVM이 이해할 수 있는 언어이다. Java Byte Code 확장자는 .class이다.


5. JIT 컴파일러란 무엇이며 어떻게 동작하는지

JIT 컴파일러는 Just-In-Time 컴파일러의 줄임말로, 동적 번역이라고도 한다.

JIT 컴파일러가 등장하게 된 배경을 알아보자.
두 가지 프로그래밍 언어의 실행 방식에 대한 이해가 필요하다.

  1. 컴파일 방식 : 소스코드를 한번에 읽을 수 있도록 변환된 Native Machine Code(기계어)를 실행하는 방식. 실행 속도는 빠르지만, 기계어를 생성하는 빌드에 시간이 소요된다. (ex) C/C++)

  2. 인터프리터 방식 : 런타임(실행 시점)에 한줄씩 읽어 들이면서 프로그램을 실행하는 방식. 실행 속도는 느리지만, 빌드 시간이 없다. (ex)python)

Java는 두 가지 방식을 혼합한 하이브리드 방식을 사용한다. 컴파일 결과물인 바이트 코드를 JVM이 읽어들인 뒤, 기계어로 해석하여 프로그램이 실행되는데 이때 인터프리터 방식의 단점을 보완하고자 JIT 컴파일러를 사용했다.

복잡하고 다양한 연산을 하면서 반복적으로 호출되는 메소드들을 JIT의 코드 캐시에 저장하기 때문에 더 빠르게 호출하여 성능 향상을 기했다.


6. JVM 구성 요소


자바의 실행 과정은 다음과 같다. Class Loader가 컴파일 된 자바 바이트코드를 Runtime Data Area에 로드하고, Execution Engine이 자바 바이트코드를 실행한다.

Class Loader

자바 컴파일러가 .java 파일을 컴파일하여 생성된 .class(바이트코드)들을 엮어 Runtime Data Area 형태로 메모리에 적재하는 역할을 한다.

Execution Engine

메모리에 적재된 클래스들을 기계어로 변환해 명령어 단위로 실행하는 역할을 한다. 이때, 인터프리터 방식과 JIT 방식을 사용한다.

Garbage Collector

더 이상 사용하지 않는 메모리를 자동으로 회수하여 개발자가 따로 메모리를 관리해야 하는 어려움을 없앤다. 정확히는 힙 영역에 생성된 객체들 중에 참조되지 않는 객체들을 메모리에서 제거하는 것이다.

Runtime Data Area

  1. Method Area
    클래스 멤버 변수, 메소드 정보, Type 정보, Constant Pool, Static, Final 변수 등이 생성된다. 상수 풀은 모든 Symbolic Reference를 포함한다.
  2. Heap Area
    동적으로 생성된 객체와 배열이 저장되는 곳으로, Garbage Collection의 대상이 되는 영역이다.
  3. Stack Area
    지역 변수, 파라미터 변수 등이 생성되는 영역이다. 동적으로 객체를 생성하면 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장된다.
    Heap에 있는 객체가 Stack에서 참조할 수 없는 경우 GC의 대상이 된다.
  4. PC Register
    현재 쓰레드가 실행되는 부분의 주소와 명령어를 저장하고 있다.
  5. Native Method Stack
    자바 외 언어로 작성된 Native Code를 저장하기 위한 영역

7. JDK와 JRE의 차이

JDK(Java Development Kit)

자바 개발 도구. 자바를 통해 프로그램을 개발할 때 사용되는 모듈(라이브러리)들이 포함된 설치 버전이다. 기본적으로 자바 프로그램을 실행하기 위한 JRE를 포함하고 있으며, 그 외에 빌드 디버깅에 필요한 모듈을 보유하고 있다.

JRE(Java Runtime Environment)

자바 실행 환경. 자바로 작성/빌드 된 프로그램을 실행시키기 위한 모듈이 모여있는 설치 버전으로, 자바 프로그램을 위한 최소 단위의 모듈이다.

profile
개발자

0개의 댓글