전공공부/자바 (JAVA)

[JAVA] 자바 가상 머신, JVM에 대해 알아보자!

jooona 2021. 12. 28. 01:33
반응형

JVM은 Java Virtual Machine의 약자로 자바 프로그램을 OS 환경과 상관없이 구동될 수 있도록 해주는 가상 머신입니다. 

 

1. JVM의 역할

 

1. OS에 구애받지 않는 실행

 

사용자가 작성한 자바 코드는 자바 컴파일러에 의해 자바 바이트 코드로 컴파일되고, JVM은 이 자바 바이트 코드를 사용자의 컴퓨터가 어떤 OS를 사용하든 상관없이 돌아가게끔 만들어줍니다.

 

즉, 원래 프로그램은 Windows에서 개발되었다면 Mac이나 Linux에서는 구동할 수 없습니다. 하지만 자바는 JVM만 실행 환경에 맞추어 준비해 놓는다면 어떤 OS를 사용하든지 상관없이 구동할 수 있다는 뜻입니다. Windows에서 개발되었더라도 Mac에 맞추어 JVM을 준비만 해 둔다면, 충분히 Mac에서도 실행이 가능합니다.

 

참고로 JVM은 이름에 자바가 들어가기 때문에 자바에만 적용될 수 있는 것이라고 생각하기 쉽지만, 사실 코틀린 등 다른 언어도 컴파일할 수 있습니다. 물론 자바가 가장 기본입니다.

 

2. 메모리 관리

 

JVM은 가비지 컬렉션(Garbage Collection)을 통해 자동으로 Heap 영역의 쓰지 않는 메모리를 회수합니다. 이를 통해 한정된 메모리를 효율적으로 사용할 수 있습니다. 

 

예를 들면 C언어의 경우 사용자가 직접 메모리 관리를 해주어야 합니다. 동적할당을 위해 malloc 함수를 이용하였다면, 사용자가 이 메모리 할당을 해제해주어야 합니다. 이런 귀찮을 일을 JVM은 알아서! 수행해줍니다.

 

 

2. 자바 프로그램 실행 과정

 

1. 프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받는다. 

2. 자바 컴파일러가 자바 소스코드(.java)를 읽어 자바 바이트 코드(.class)로 번역한다.

3. 클래스 로더(Class Loader)를 이용해 자바 바이트 코드를 JVM으로 로딩한다.

4. 로딩된 자바 바이트 코드를 실행 엔진(Execution Engine)을 이용해 실행한다.

 

 

3. JVM 구조

 

1. Class Loader

자바 바이트 코드 파일인 Class 파일을 JVM으로 로딩하는 역할을 합니다. 사실 엄밀히 말하자면 JDK가 아닌 JRE의 구성요소이기는 하지만, JVM의 동작과 밀접한 연관이 있어 추가하였습니다.

 

2. Execution Engine

클래스 로더를 통해 JVM으로 로딩된 자바 바이트 코드를 명령어 단위로 읽어서 실행합니다. Execution Engine의 컴파일 방식은 여러 가지가 있는데 밑에서 더 자세하게 다루겠습니다.

 

3. Runtime Data Area

JVM의 메모리 영역입니다. 자바 애플리케이션을 실행할 때 데이터를 적재하는 영역으로, Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 나눌 수 있습니다.

 

4. Garbage Collector

Heap 영역의 메모리를 자동으로 관리해 줍니다.

 

 

4. Execution Engine 컴파일 방식

 

1. Interpreter 방식

자바 바이트 코드를 한 줄씩 번역하고 실행하는 방식입니다. 

 

2. 정적(Static) 컴파일 방식

실행하기 전에 컴퓨터가 이해할 수 있는 언어인 Native Code로 변환하는 방식입니다.

 

3. JIT(Just In Time) 방식

Interpreter 방식의 단점을 보완하기 위해 도입된 컴파일러입니다. 이미 한번 읽어서 Native Code로 변환한 소스코드는 캐싱을 통해 저장해두기 때문에 다시 번역하지 않기 때문에 실행 속도를 높일 수 있습니다. 

 

 

5. Runtime Data Area 구성

 

1. Method Area (Class Area):  모든 쓰레드가 공유하는 영역으로 JVM이 시작될 때 생성됩니다. 클래스와 인터페이스의 상수, 메서드와 필드 정보, static 변수, 타입 정보 등을 보관합니다.

 

2. Heap Area: 동적으로 할당되는 데이터가 저장되는 영역으로, Garbage Collection에 의해 관리됩니다.

 

3. Stack Area: 메서드가 호출 되면 메서드 안에서 사용하는 값들과 매개 변수, 지역 변수, 리턴 값 등을 저장한 뒤, 메서드가 종료될 때 함께 삭제되는, 데이터들이 임시적으로 저장되는 영역입니다. 스택 영역이니 메서드가 호출되는 순서대로 쌓이겠죠? 

 

4. PC Register: 현재 어떤 명령어가 실행되어야 하는지에 대해 저장하는 레지스터로, 현재 수행 중인 JVM 명령의 주소를 갖고 있습니다.

 

5. Native Method Stack: 자바 이외의 언어로 작성된 Native Code를 위한 영역입니다.

 

 

 

참고

https://asfirstalways.tistory.com/158 

https://steady-coding.tistory.com/305 

https://velog.io/@pearl0725/JVM%EC%9D%80-%EC%96%B4%EB%96%A4-%EC%97%AD%ED%95%A0%EC%9D%84-%ED%95%A0%EA%B9%8C

반응형