-
Java Virtual MachineJAVA 2022. 8. 24. 17:16
우리는 프로그램을 효율적으로 실행시키기 위해 CS를 공부한다.
멀티 프로세스나 멀티 스레드는 현대 프로그래밍에서 매우 중요한 개념으로,
하드웨어의 성능 향상으로 인한 프로그램 성능 향상은 기대하기 힘들어졌기 때문에
멀티 스레드 환경을 구축해야 하는 개발자의 역량이 매우 중요해졌다.
이를 위해 우리는 프로세스와 스레드가 뭔지 배우고, 어떤 구조를 가지고 있으며
어떤 작업이 수행되는지 파악해야 한다.
자바도 마찬가지이다.
자바는 JVM이라는 독특한 특징을 가지면서, 이를 위한 독자적인 메모리 구조를 가진다.
그렇기에 우리는 자바를 이용해서 좋은 프로그램을 만들기 위해서는 자바를 깊게 이해해야 할 필요가 있다.
Java Virtual Machine(JVM : 자바 가상 머신)이란, 자바 바이트 코드를 실행할 수 있는 주체이다.
다른 언어와 달리 자바는 컴파일 후에 바로 기계어로 번역되지 않고 바이트 코드로 번역된다.
그리고 바이트 코드를 기계어로 번역하는 것이 바로 JVM이다.
쉽게 비유를 들어보자.
우리가 영어로 회화를 하려고 할 때, 의식적으로 한국어 문장을 생각하고,
그걸 영어로 바꿔 말한 적이 있을 것이다.
한국어가 프로그래밍 언어에, 영어를 기계어에 대입한다면 이것이 바로 컴파일이 된다.
그렇다면 JVM은 어떤 역할에 해당할까?
JVM은 통역사의 역할에 해당한다.
한국어에서 컴파일된 영어를 통역사에게 넘겨주면, 통역사는 다시 번역해서 일본어를 넘겨준다.
위의 비유가 JVM에 완전히 들어맞지는 않겠지만, 흐름만 알아두었으면 한다.
JVM의 구조는 다음과 같다.
출처) https://coding-factory.tistory.com/828 자바 컴파일러가 .java 파일에 쓰인 코드를 컴파일하면 .class라는 바이트 코드 파일로 변환된다.
.class 파일을 Class Loader가 Runtime Data Area로 적재하고, Execution Engine이 명령어들을 실행시킨다.
명령어가 실행되는 과정에서 Runtime Data Area에서 여러 상호작용이 일어나며 프로그램이 작동하게 된다.프로그램이 실행되는 과정과 각 영역에 대해서는 다음에 자세히 알아보도록 하고,
위의 과정만 놓고보면 통역사 예시와 거의 비슷할 것이다.
한국어 → 영어로 번역(.java → .class)
→ 그걸 통역사에게 전달(.class → Class Loader → JVM)
→ 통역사는 다시 한번 번역(JVM → Execution Engine)하여 일본어를 전달이 과정을 통해 자바로 쓰인 언어가 기계어로 번역되고, 프로그램을 실행하게 된다.
하지만 어째서 JVM이라는 통역사가 필요한 걸까?
그냥 자바 → 기계어로 만들면 더 효율적이지 않았을까?
JVM에 대해서 더 자세히 알아보자.
- Write Once, Run Anywhere(WORA). :
(코드를) 한 번 작성했으면, 어디서든지 작동 가능하게. - 플랫폼에 의존적이지 않다.
- 자동으로 메모리를 관리한다.
첫 번째 WORA와 두 번째 플랫폼에 의존적이지 않다는 긴밀한 연관이 있다.
세 번째는 나중에 얘기할 Garbage Collector와 연관이 있는데, 지금은 넘어가도록 한다.
WORA는 사실 자바가 탄생한 배경이자 캐치프레이즈로, 이에 대해서는 왜 운영체제가 나뉘었는지 생각해봐야 한다.
우리가 보기에 운영체제라는 것은 UI만 바뀌고 똑같은 것으로 보이지만 실상은 그렇지 않다.
C와 자바의 명령어, 함수들이 다르듯이 운영체제도 내부적으로 명령어와 수행하는 방식이 각자 다르다.
어떤 것은 편의성을 위해, 또는 효율성을 위해 명령어를 다르게 구성한다.
따라서 프로그래밍 언어로 작성한 프로그램은 운영체제에 따라 다르게 작동한다.
대표적으로 Windows의 .exe 파일은 Mac OS에서 실행시킬 수 없다.
명령어의 작동 방식이 다르기 때문이다.
그렇기 때문에 자바가 등장하기 전의 언어들은 플랫폼,
즉, 운영체제에 의존적이었다.
결국 자바 이전의 언어들은 컴파일(언어 → 기계어)과정만 존재했고,
다른 플랫폼에서 실행시키기 위해 플랫폼에 맞는 컴파일러로 바꿔주어야 했다.
이를 해결하기 위해 나온 것이 바로 JVM이며, JVM만 있으면 어떤 플랫폼에서든지 실행이 가능하다는 것이다.
물론 JVM이라는 통역사의 존재로 인해 생기는 몇 가지 단점은 있다.
- JVM으로 인해 중간 단계가 추가되어 프로그램이 느려진다.
- 사용자가 JVM을 설치하지 않으면 프로그램을 실행할 수 없다.
※ 정확하게는, JVM 자체는 플랫폼에 의존적이다.
그럼에도 불구하고 높은 편의성과 객체 지향 등 여러 장점들 덕분에 자바는 인기 언어로 떠오르게 되었고,
지속적인 개선으로 실행 속도도 빨라지게 되었다.
※ 참고 자료
https://coding-factory.tistory.com/828
https://yeondube.tistory.com/entry/JVM
※ 사용 자료
Person icons created by Freepik - Flaticon
Thought icons created by Freepik - Flaticon
Chat icons created by Alfredo Hernandez - Flaticon
'JAVA' 카테고리의 다른 글
Call by Value / Reference (0) 2022.09.01 Garbage Collector (0) 2022.08.26 자바 메모리 구조 (0) 2022.08.26 - Write Once, Run Anywhere(WORA). :