본문 바로가기

[STUDY] 자바_whiteship :)

1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

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

목표

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

학습할 것

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

 

 

JVM이란 무엇인가

Java Virtual Machine. Java 와 운영체제간의 중개자 역할을 한다. java로 개발된 어플리케이션을 여러 운영체제에서 정상적으로 작동할 수 있도록 해준다.( 운영체제별로 개발하지 않아도 되는건 JVM덕분)

java 언어로 개발된 어플리케이션은 OS가 바로 이해하지 못한다. OS는 기계어(바이너리코드)로 이해하기 때문이다. java언어를 OS가 이해하도록 하기 위해선 기계어로 바꾸어주는 역할(통역)이 필요하다. 이 역할을 JVM이 하게되는데 JVM은 바이트 코드로 된 .class파일만 실행할 수 있기 때문에 java파일을 바이트코드로 바꿔주는 컴파일 과정이 필요하다.

 

컴파일하는 방법

이클립스로 개발할땐 빌드버튼만 눌러주면 알아서 컴파일이 되었기 때문에 어떻게 컴파일 되는지 알지 못했다.

자바소스파일(*.java)은 javaCompiler(javac.exe)에 의해 바이트코드(*.class)로 생성된다. 

 

ex) HelloWorld.java 파일생성후 컴파일을 한다.

 

터미널에서 ,$ javac HelloWorld.java (환경변수를 설정해 준경우)

또는 $ %자바설치위치%\bin\javac HelloWorld.java

 

실행하는 방법

앞에서 컴파일해놓은 .class파일을 java.exe 로 실행

터미널에서, $ java HelloWorld.class

 

바이트코드란 무엇인가

자바컴파일러가 자바 소스를 컴파일한 클래스파일(*.class). JVM에서 돌아가는 이진표현법. 

 

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

Just-In-Time Compiler. 프로그램을 실제 실행하는 시점에서 기계어로 번역하는 컴파일 기법.

실시간으로 컴파일한다. (컴파일은 아까 자바파일을 클래스파일로 만들때 했는데 또함? 바이트코드를 바이너리코드로)

 

바이트코드를 바이너리코드로 변환하는데(Interpreter) 자주 실행되는 코드 한꺼번에 변환하여 캐쉬에 저장. 빠름빠름.

 

JVM의 구성요소

ClassLoader: .class파일을 JVM으로 올리는 역할

Execution Engine: .class파일을 바이너이코드로 변환 Interperter, JIT

Runtime Data Area: 실제로 프로그램이 돌아가는 영역

GC(Garbage Collector): 메모리관리

 

JDK와 JRE의 차이

JDK (Java Development Kit) : 자바개발도구. 자바를 개발하기위한 도구. JRE + 컴파일러 + 디버거 등등

JRE (Java Run-time Environment) :  자바실행환경. 자바언어로 개발된 소프트 웨어를 실행하기 위한 플랫폼. 

 

자바프로그램을 실행하려면 JRE이만 있으면 되고, 자바프로그램을 만들려면 JDK가 있어야 한다.

 

 

[개발자] -> Helloworld.java -> 컴파일 javac.exe -> Helloworld.class(바이트코드) ->  [ java.exe] -> 메모리에올림 -> [JIT] -> 바이너리코드 -> [OS]
                                                        Compiler                                                                                JVM                                  

'[STUDY] 자바_whiteship :)' 카테고리의 다른 글

9주차 과제: 예외 처리  (0) 2021.01.13
8주자 과제: 인터페이스  (0) 2021.01.05
7주차 과제: 패키지  (0) 2020.12.30
5주차 과제: 클래스  (0) 2020.12.14