본문 바로가기
Study/Java_study

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

by hjshims 2021. 7. 18.

♨학습내용

더보기

☞ JVM이란 무엇인가?

☞ 컴파일 하는 방법

☞ 실행하는 방법

☞ 바이트 코드란 무엇인가?

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

☞ JVM의 구성요소

☞ JDK와 JRE의 차이

 

 

  • JVM이란?

- JVM(Java Vritual Machine)의 약자

- Java Byte Code를 본 기기의 OS에 맞게 해석해주는 역할을 하는 가상머신.
- 한번 작성하면 어디서든 실행할 수 있다.
- 자바 코드로 작성한 프로그램은 실행할 환경에 독립적 실행이 가능하게 해준다.

- 자바로 작성된 애플리케이션은 모두 이 가상 컴퓨터(JVM)에서만 실행되기 때문에, 애플리케이션이 실행되기 위해서는    반드시 JVM이 필요하다.

- 일반 애플리케이션의 코드는 OS만 거치고 H/W로 전달되지만, Java 애플리케이션은 JVM을 거친 후 OS를 거치기 때문에 속도가 느리다는 단점이 있지만 JIT컴파일러를 구현해 이점을 극복했다.


  • 컴파일 하는 방법

- 컴파일은 사람이 이해하는 언어를 기계어로 바꾸는 과정.

- 다시 말해, 원시코드에서 목적 코드로 바꾸는 과정.

- 자바에서의 컴파일은 자바 소스코드(.java)를 읽어 자바 바이트코드(.class)로 변경하는 것이다.

- javac(자바 컴파일러)를 통해서 컴파일한다.

 

$ javac 파일명.java

 

- 이렇게 실행하면 파일명.class 파일이 생성된다. 생성된 .class 파일은 JVM이 실행할 수 있다.


  • 실행하는 방법

- 일반적인 방법

$ java 파일명 (확장자인 .class 생략가능)

 

- 패키지가 포함되어 있다면 밑의 방법으로 하면된다.

 

$ java 패키지명.파일명

  • 바이트 코드란 무엇인가?

- 가상 컴퓨터 (Virtual Machine)에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.

- 즉, 가상머신이 이해할 수 있는 0과 1로 구성된 이진코드를 의미.

- 바이트 코드는 고급 언어로 작성된 소스 코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다.

- 어떤 플랫폼에도 종속되지 않고 실행될 수 있는 가상 머신용 기계어 코드이다.

 

*플랫폼: 개발환경, 실행환경 등 어떠한 목적을 수행할 수 있는 환경


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

- JIT (Just In Time)

- JIT가 뭔지 알아보기에 앞서 컴파일에는 두가지 방식이 있다. 이 두가지 방식을 혼합한게 JIT컴파일러 !

1. 프로그램을 실행할 때마다 컴퓨터가 알아 들을 수 있는 언어로 변환하는 방식인 인터프리터 방식

  → 코드를 한줄 씩 번역하여 실행

2. 실행하기 전에 컴퓨터가 알아 들을 수 있는 언어로 변환하는 작업을 미리 실행하는 컴파일 방식

  → 코드를 한번에 번역하고 실행

 

- JIT 컴파일러의 동작방식: 바이트코드를 네이티브 코드로 컴파일해주는 역할

- 인터프리터 효율을 높이기 위해, 인터프리터가 반복되는 코드발견하면, JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔둔다.

- 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드바로 사용한다.


  • JVM 구성요소

<JVM 구성요소>

  • JVM은 JRE 안에 있는 가상머신으로서 작은 가상 컴퓨터이기 때문에 독자적인 데이터메모리 영역실행엔진을 가지고 있다.

- Class Loader: 동적로딩을 통해 필요한 클래스들을 로딩하여 Runtime Data Area의 Method 영역에 저장

- Runtime Data Areas: JVM의 메모리로서 운영체제로부터 할당 받는다. 크게 쓰레드 Stack, Heap, Method Area로 나뉨

컴파일된 자바 클래스 파일을 저장하는 메모리공간.

- Execution Engine: 메모리에 올라온 바이트코드를 명령어 단위로 하나씩 실행시켜준다. JIT컴파일러와 Interpreter, GC(가비지컬렉션)로 이루어져있다.

 

*Stack: 메소드 호출 시 생성되는 스레드 수행 정보를 기록 (임시 데이터 저장)

Heap: 런타임 시 동적할당하여 사용하는 메모리 영역 (New연산자를 통해 생성한 객체, 인스턴스를 저장하는 공간, GC대상)

Method Area: Class의 데이터를 저장 (Class의 메소드) 


  • JDK와 JRE의 차이

※ JVM만 가지고는 자바 소스코드를 실행시킬 수 없다.

   JVM은 실제 돌아가는 프로그램이 아니라 자바 소스를 실행하기 위한 Interface에 가깝기 때문이다.

   실제로 작동하는 것은 JRE이다. (실제 바이트코드를 실행하는데는 JRE만 있으면 됨)

  • JDK: Java Development Kit, JRE에서 제공하는 실행환경과 자바 개발에 필요한 여러가지 명령어와 컴파일러를 포함
  • JRE: Java Runtime Enviroment, 자바 S/W를 실행하기 위한 S/W. 이는 클래스 라이브러리로더 클래스JVM을 포함

※ 그렇지만 자바로 프로그램을 만들기 위해서는 JDK가 있어야한다.

    JDK는 JRE + 개발을 위한 도구들이라고 생각하면 된다.

☞ JDK는 자바 통합 개발 환경 / JRE는 자바 실행 환경을 의미하며, JDK에 속해있다.

'Study > Java_study' 카테고리의 다른 글

Java_study_6 (상속)  (0) 2021.08.09
Java_study_5 (클래스)  (0) 2021.08.04
Java_study_4 (제어문)  (0) 2021.08.01
Java_study_3 (연산자)  (0) 2021.07.26
Java_study_2 (자바 데이터 타입, 변수 그리고 배열)  (0) 2021.07.26