Backend/Java

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

가은파파 2021. 1. 10. 22:55

학습할 것

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

JVM 은 무엇인가?

JAVA는 자바 컴파일러에 의해. class 바이트코드 소스로 컴파일된다. 그러나 컴퓨터는 기계어로 변경해야만 이해할 수 있기 때문에 해당하는 바이트코드는 JVM(Java Virtual Machine)이라는 Runtime 환경이 필요하다.
JVM 같은 중간 언어를 해석해주지 못하는 언어들은 운영체제가 변경될 때마다 그에 맞게 실행 가능한 프로그램을 만들어야 한다. 이러한 단점을 보완하기 위해 바이트코드를 기계어로 번역해주는 과정을 한 번 더 하며 성능을 포기하고 편리함을 선택했다.

JAVA는 왜 다른 언어에 비해 느림?

바로 실행가능 코드가 아닌 바이트코드를 만든 후, Interpreter(인터프리터) 방식으로 기계어로 번역하여 실행하기 때문입니다.
Dynamic Linking: Unlike C, linking is done at run-time, every time the program is run in Java.
Run-time Interpreter: The conversion of byte code into native machine code is done at run-time in Java which furthers slows down the speed

JVM 특징

1.자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행합니다.
2.JAVA와 OS사이에 중재자 역할을 합니다.(OS에 구애받지 않고 사용 가능)
3. 메모리 관리, Garbage Collection을 수행합니다.
4.Stack기반 가상 머신입니다.(하드웨어는 레지스터 기반으로 동작)

JVM을 알아야 하는 이유?

메모리 누수를 줄일 수 있도록, 메모리 구조를 알고 개발해야 성능의 차이가 날 수 있다.

자바 프로그램 실행하는 과정

1.JVM은 OS로부터 프로그램에 필요한 메모리를 할당받으며 용도에 따라 여러 영역에 나누어 관리합니다.

2. 자바 컴파일러(javac)가 자바 소스(. java)를 바이트코드(. class)로 변환시킵니다.

3.ClassLoader를 통해 class파일들을 JVM으로 로딩합니다.

4.class파일은 Execution Engine을 통해 번역됩니다. 5. 바이트코드는 Runtime Data Area에 실질적 수행이 이루어지며, JVM을 필요에 따라 Synchronization과 GC 같은 관리 작업을 수행합니다.

출처 : https://www.guru99.com/java-virtual-machine-jvm.html#:~:text=Java%20Virtual%20Machine%20(JVM)%20is,code%20for%20a%20particular%20system.

JVM 구성요소


1.Class Loader -클래스 파일을 읽고, 링크를 통해 배치하는 작업을 수행하는 모듈입니다. class파일들을 엮어 Runtime data area형태로 메모리에 적재하는 역할을 합니다.

2.Execution Engine

1) Interpreter : 실행 엔진은 바이트 코드 단위로 읽어서 실행합니다. 단점은 한 줄씩 수행하기에 속도가 느립니다.
2) JIT(Java In Timit) 방식 : 인터프리터 단점을 보안하기 위해 JIT 컴파일 방식이 나왔습니다. 바이트코드 전체를 네이티브 코드로 변경하여 작업을 수행. 한번 변경된 코드를 캐시에 보관하기 때문에 수행 속도가 빠릅니다. 단점은 네이티브 코드로 번역할 때 시간이 걸리기 때문에 자주 수행되지 않을 경우에는 좋지 않습니다.
3) Garbage Collector : GC를 수행하는 모듈(Thread)이 있습니다. Heap메모리 영역에 생성된 객체들 중 참조가 없는 객체를 탐색 후 제거하는 역할을 합니다.

3.Runtime Data Area.

  • Method Area , Heap : 쓰레드 공유
  • Stack, PC Register, Native 매소드 Stack : 쓰레드 마다 존재



1) Method Area -클래스 멤버 변수, 메서드 정보, Type정보, static, final 변수 등 생성된다. 상수 풀은 모든 Symbolic Reference를 포함하고 있습니다. 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간입니다.
2) Heap 영역 -객체를 저장하는 가상 메모리 공간입니다. new연산자를 통해 생성된 객체와 배열을 저장합니다. Method Area영역에 올라온 객체로 생성할 수 있습니다.
a) New/Young 영역
b) Permanent Generation
c) Old영역

쓰레드마다 존재



3) Stack 영역 -프로그램 실행 시 임시로 할당되었다가, 메서드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 공간입니다. 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들이 임시로 보관될 때 사용되는 영역입니다.
ex. 매서드가 호출될때마다 생성된다. 매서드가 실행되면 pop되어 제거된다. main() -> call1() -> call2()

4) PC Register -Thread(프로세스 내에서 실행되는 흐름)가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로 스레드마다 하나씩 존재합니다. 어떤 부분을 어떤 명령으로 실행해야 할 지에 대한 기록하는 부분으로 현재 수행 중인 JVM 명령의 주소를 보관합니다.

5) Native Method Stack -프로그램 컴파일 시 생성되는 바이트코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역입니다. (JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간입니다.

컴파일하는 방법

예를 들어 practice.java라는 자바 파일이 존재한다면.
$ javac practice.java
cmd 작업에 의해 practice.java파일이 컴파일되어. class파일이 생성된다.

실행하는 방법

$ java practice
위 cmd 작업을 통해 실행을 할 수 있다.

바이트 코드란 무엇인가?

JAVA파일을 JAVA Complier에 의 컴파일하면 1byte 소스코드로 생성된다. 해당하는. class파일의 소스는 바이트 코드로 구성되어 있다

'Backend > Java' 카테고리의 다른 글

[Java] 선택문, 반복문  (0) 2021.01.18
Java 예외 처리 정리  (0) 2021.01.16
Junit5 문법 / 예제 / 활용 방법  (0) 2021.01.16
연산자 (3주차)  (0) 2021.01.12
자바 데이터 타입, 변수 그리고 배열 (2주차)  (0) 2021.01.11