안드로이드, 자바/자바

JVM과 자바 코드를 실행하는 원리

sondiaa 2021. 4. 26. 17:20

-JVM이란 무엇인가

JVM이란 JAVA Virtual Machine, 자바 가상 머신의 약자를 따서 부르는 용어로 자바 프로그램 실행 환경을 만들어 주는 소프트웨어이다. 자바 코드를 컴파일하여 .class 바이트 코드로 만들면 이 코드가 자바 가상 머신 환경에서 실행된다. 그렇기에 현재 사용하는 컴퓨터의 운영체제에 맞는 자바 실행 환경(JRE)이 설치되어 있다면 자바 가상 머신이 설치되어 있는 것이다.

https://jeong-pro.tistory.com/148

 

-컴파일 하는 방법

우선 터미널에서 자바 파일이 있는 경로로 접속한다. 그 후 javac main.java를 입력한다. 

위의 명령을 하면 main.java 파일은 컴파일되어 main.class 파일이 생성된다.

 

 

-실행하는 방법

컴파일 하여 만들어진 파일을 바이트 코드라고 하는데 완벽한 실행 파일이 아니다. 결국 운영체제에 완벽히 맞는 기계어가 아니라 중간 기계어인 것이다. 그렇기에 이 바이트 코드를 실행하기 위해 운영체제에 맞는 자바 가상 머신이 필요하다. 즉, 운영체제에서 직접 실행하는 게 아니라 가상 머신에서 먼저 실행하고, 이 가상 머신이 운영체제에 맞는 완벽한 실행 파일로 바꿔주는 것이다. 그렇기에 우리는 class 파일을 만들어 두면 운영체제에 맞는 가상 머신을 이용하여 어느 환경에서나 실행할 수 있다.

 

 

-바이트 코드란 무엇인가

바이트 코드는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법으로 기계가 이해하기 쉬운 코드가 되는 것이다. 그렇기에 바이트 코드는 가상머신이 존재하는 곳에는 대체로 함께 존재한다고 할 수 있다. 이러한 바이트 코드는 인터프리터 방식으로 해석한다. 

 

 

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

자바는 운영체제에 상관 없기 위해 자바 코드를 바이트 코드로 변환하는 과정이 필요한데 이 과정을 진행하는 자바 해석기가 매우 느리다고 한다. 그것을 해결한 것이 바로 JIT 컴파일러이다. JIT 컴파일러는 실행 시점에 기계어 코드를 생성하는데, 같은 코드가 반복되면 매번 기계어 코드를 새로 생성하지 않고 이전에 만든 기계어를 재사용한다. 또한 JIT 컴파일러는 운영체제에 맞게 바이트 실행 코드로 한 번에 변환하여 실행하기 때문에 이전의 자바 해석기 방식보다 성능이 10 ~ 20배 뛰어나다.

 

 

-JVM 구성 요소

(1) 런타임 데이터 영역, (2) 클래스 로더, (3) 실행엔진, (4) 가비지 컬렉터 

런타임 데이터 영역은 JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.

메소드 영역은 변수의 이름, 데이터 타입, 필드 정보 등이 생성되는 영역이다.

힙 영역은 new 키워드로 생성된 객체와 배열이 생성되는 영역이다.

스택 영역은 지역 변수, 리턴 값, 임시 값 등이 생성되는 영역이다.

PC 레지스터는 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.

Native method stack은 자바 외 언어로 작성된 코드를 위한 메모리 영역이다.

 

클래스 로더는 class 파일을 읽어서 할당받은 메모리인 런타임 데이터 영역에 적재하는 역할을 한다.

 

실행엔진은 클래스 로더를 통해 배치된 클래스들을 기계어로 변경해 명령어 단위로 실행하는 역할을 하며 방식은 인터프리터 방식과 JIT 컴파일러를 이용하는 방식이 있다.

 

가비지 컬렉터는 Heap 메모리 영역에서 생성된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거해주는 역할을 한다.