개요
JVM(Java Virtual Machine)은 자바 프로그램 실행환경을 만들어 주는 소프트웨어이다.
자바 개발자라면 반드시 알아야하는 이 JVM을 한번 부셔보려고 한다.
JVM
일단 JVM이란 위에서 말했듯 자바 프로그램 실행환경을 만들어주는 소프트웨어이다.
자바 코드를 컴파일하면 .class 바이트 코드로 만들어진다. 이 코드가 JVM 환경에서 실행된다.
JVM은 자바 실행 환경 JRE Java Runtime Environment안에 포함되어있다.
현재 사용하는 컴퓨터에 맞는 운영체제에 JRE가 설치되어 있다면 JVM이 있다는 뜻이다.
JVM 특징
JVM을 왜 사용하는 것일까?
JVM을 사용하면 하나의 바이트코드 즉 .class로 모든 플랫폼에서 동작할 수 있는 이점이 있다.
.class 파일은 바이트 코드라고 하는데 사람이 쓰는 자바 코드에서 컴퓨터가 읽는
기계어의 중간 단계라고 생각하면 된다.
C, C++에서는 컴파일 플랫폼과 타겟 플랫폼이 다를 경우에는 프로그램이 동작하지 않는다.
만약 c로 작성되어 있는 파일을 윈도우에서 컴파일한 exe파일로 만들었다 했을때는
리눅스에서는 이 프로그램이 동작하지 않는다. 즉 컴파일 플랫폼과 타겟 플랫폼이 다를 경우에는
프로그램이 동작하지 않는 문제가 있다. 만약 다른 플랫폼에서 실행하고 싶다면 크로스 컴파일을 해
리눅스 운영체제에 맞는 실행 파일을 새로 만들어야하는 불편함도 있다.
그러나 Java에 경우는 다르다 Java로 작성된 .java 파일들을 컴파일 하면 .class 파일이 생성되고
이렇게 생성된 바이트코드는 각자의 플랫폼에 설치되어 있는 JVM이 운영체제에 맞는 실행파일로 바꿔준다.
즉 자바에서는 C,C++과 달리 JVM을 사용하기 때문에 각자의 플랫폼에 맞게끔 컴파일을 따로따로 해줘야 할 필요가 없다.
하나의 바이트코드로 JVM이 설치되어있는 모든 플랫폼에서 동작이 가능하다.
자바는 컴파일된 바이트코드로 어떠한 JVM에서도 동작이 가능해 플랫폼에 의존적이지 않지만
반대로 JVM에게는 의존적이다. 즉 리눅스나 윈도우나 JVM이 있어야 실행될 수 있으므로
자바 프로그램을 실행하기 위해서는 무조건 JVM이 필요하다.
자바의 실행과정, JVM
우리가 자바로 코드를 작성하고 터미널에 자바 컴파일러인 javac에 컴파일 명령을 내리면
.class 파일이 생성된다. 이후 이 바이트코드는 클래스 로더를 통해 JVM Runtime Data Area로 로딩된다.
로딩된 .class 바이트 코드를 실행할 컴퓨터에 깔린 JVM에 가져다주면 그 컴퓨터가 이 프로그램을
실행할 때 이 JVM이 그때마다 한번씩 기계어로 해석해준다.
바이트코드를 읽는 과정, 방식
JVM은 바이트모드를 명령어 단위로 읽어 해석한다.
그 중 Interpreter 방식, JIT 방식 이 두가지 방식을 혼합해 사용한다.
먼저 Interpreter 방식은 바이트코드를 한 줄씩 해석하고 실행하는 방식으로 초기 방식이며
속도가 느리다는 단점을 가지고있다.
이렇게 느린 속도를 보완하기 위해 나온것이 JIT(Just Int TIme) 컴파일 방식이다.
바이트코드를 JIT 컴파일러를 이용해 프로그램을 실행하는 시점에서 각 운영체제에 맞는
네이티브 코드로 변환해 실행 속도를 개선했다. 하지만 바이트코드를 네이티브 코드로 변화하는데에도
비용이 소요되므로, JVM은 인터프리터 방식을 사용하다 일정 기준이 넘어가면 JIT 컴파일 방식으로 실행한다.
JIT (Just In Time)
인터프리터 방식에서 JIT방식으로 개선되면서 속도적인 측면에서도 상당히 개선이 되었다.
JIT 컴파일러는 같은 코드를 매번 해석하지 않는다. 프로그램을 실행할 때 컴파일을 하면서
해당 코드를 캐싱해버린다. 이후에 바뀐 부분만 컴파일을 진행하고, 나머지는 캐싱된 코드를 사용한다.
이렇게 JIT 컴파일러는 운영체제에 맞게 바이트 실행 코드로 한 번에 변환하여 실행하기 때문에
자바 인터프리터 방식의 성능보다 10배 ~ 20배 정도가 더 좋다.
'Computer Science.' 카테고리의 다른 글
[MySQL] 전문 검색 인덱스 (2) | 2024.04.14 |
---|---|
TEXT vs VARCHAR [ MySQL ] (24) | 2024.01.08 |
VLAN 이해하기 - VLAN, Trunk, Access Port (5) | 2023.10.18 |
TCP 3-way / 4-way Handshake (4) | 2023.10.13 |
gRPC, RPC, 작동원리, HTTP API 비교 (0) | 2023.10.06 |