[자바/Java] JVM이란?

resilient

·

2020. 12. 26. 17:40

728x90
반응형

https://github.com/whiteship/live-study/issues/1

 

1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. · Issue #1 · whiteship/live-study

목표 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기. 학습할 것 JVM이란 무엇인가 컴파일 하는 방법 실행하는 방법 바이트코드란 무엇인가 JIT 컴파일러란 무엇이며 어떻게 동작하는지 JV

github.com

목표

자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.

학습할 것

  • JVM이란 무엇인가
  • 컴파일 하는 방법
  • 실행하는 방법
  • 바이트코드란 무엇인가
  • JIT 컴파일러란 무엇이며 어떻게 동작하는지
  • JVM 구성 요소
  • JDK와 JRE의 차이

#JVM이란 무엇인가

 

JVM이란 Java Virtual Machine 의 줄임말로, 직역하면 자바를 실행하기 위한 가상 기계 이다.

'가상기계' (Virtual Machine)는 소프트웨어로 구현된 하드웨어를 뜻하는 넓은 의미의 용어이며, 컴퓨터의 성능이 향상됨에 따라 점점 더 많은 하드웨어들이 소프트웨어화되어 컴퓨터 속으로 들어오고 있다.

자바로 작성된 어플리케이션 들은 모두 JVM에서만 실행되기 때문에 자바 어플리케이션 들이 실행되기 위해서는 반드시 JVM이 필요하다.

그리고 가장 중요한 메모리관리, Garbage collection을 수행한다.

Java 어플리케이션
JVM
OS(Windows, Mac)
컴퓨터(하드웨어)

일반 어플리케이션의 코드는 OS만 거치고 하드웨어로 전달되는 반면, Java어플리케이션은 JVM을 한번 더 거치기 때문에, 컴파일된 자바코드인 바이트코드 를 사용하므로써, 자바의 중요한 장점 중의 하나인 'Write once, run anywhere', (한번 작성하면 어디서든 실행된다) 가 가능하게 될 수있다.

 

#컴파일 하는 방법

 

컴파일러란 프로그래밍언어로 작성된 소스의 번역을 해주는 시스템 소프트웨어이다.

자바는 JDK에 포함되어 있는 javac 라는 컴파일러를 통해 컴파일 할 수 있다. 

.java 파일 이나 .class(바이트코드)를 만든다.

 

#바이트코드란 무엇인가

 

위에서 설명한 JVM이 이해할 수 있는 기계어가 바이트코드 이다.  

자바 문법으로 작성한 .java 파일은 사람이 이해할 수 있는 언어로 작성했기 때문에 컴퓨터는 이해할 수 없다.

javac 명령을 통해 컴파일은 하면 .class 확장자를 갖는 바이트코드가 만들어지고, JVM은 클래스 로더를 통해 읽어 들여  자바 API와 함께 실행 시켜준다.

(클래스 로더란? 아래 #JVM의 구성참조)

Java의 실행과정 (출처 : http://www.careerbless.com/java/basics/JavaArchitecture.php)

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

 

Just In Time 의 약자로 인터프리터 방식의 단점을 보완하기 위해 도입되었다.

(인터프리터란? 아래 #JVM의 구성참조)

인터프리터 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고, 이후에는 계속 해서 쓰이는 코드는 네이티브 코드로 직접 실행하는 방식으로, 시간이 단축되고 효율적이라는 장점이 있다.

 

#JVM 구성 요소

JVM의 구성

JVM은

  • Class Loader(클래스 로더)
  • Execution Engine(실행 엔진)
  • Interpreter(인터프리터)
  • JIT compiler( JIT컴파일러)
  • Garbage Collector(가비지 컬렉터)

로 구성되어 있다.

 

  • Class Loader(클래스 로더)

클래스 로더란 .class 파일을 JVM내로 로드하고 Runtime 시에 동적으로 클래스를 로드한다.

즉, 클래스를 처음으로 참조할때, 해당 클래스를 로드하고 링크한다는 것이다.

 

  • Execution Engine(실행 엔진)

실행 엔진은 클래스는 실행시키는 역할이다. 클래스 로더가 JVM의 런타임 데이터 영역에 바이트 코드를 배치시키고

이 바이트 코드들은 실행 엔진을 통해 실행된다. 실행 엔진이 기계가 실행할 수 있는 형태로 변경할 때는 

인터프리터 or JIT 방식을 사용하게 된다.

 

  • Interpreter(인터프리터)

인터프리터는 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경을 말한다. 

 

  • JIT compiler( JIT컴파일러)

위에 #JIT 컴파일러란 무엇이며 어떻게 동작하는지 참조

 

  • Garbage Collector(가비지 컬렉터)

GC를 수행하는 쓰레드가 들어있다.

 

 

#JDK와 JRE의 차이

 

JDK는 Java Development Kit 의 줄임말로 자바 개발 도구를 의미하고

JRE는 Java Runtime Enviorment 의 줄임말로 자바 실행 환경을 의미한다.

 

JDK = JRE + 개발에 필요한 실행파일들

JRE = JVM + 클래스라이브러리(Java API등)

 

 

#Reference

  • blog.naver.com/hsm622/222138523668
  • 자바의정석 (저자. 남궁성)
  • asfirstalways.tistory.com/158

 

 

반응형