JAVA 강의를 듣는데 가장 큰 특징이 “운영체제 독립성”이라고 했다.
이걸 듣고 2가지 궁금한 점이 생겼음
1. JVM이 뭐하는 놈인지 궁금함
2. 이때까지 python 등 프로그래밍 언어를 사용하며, OS에 종속성이 있다는 느낌을 받은 적이 없는데 다른 언어는 어떻게 실행되는 걸까?
1. JVM은 뭘까?
JVM은 Java Virtual Machine의 줄임말로 말 그대로 자바에서 프로그램을 실행하기 위해 사용하는 가상 머신이다.
나는 이 발상이 너무 아름다운 것 같다. 어떻게 언어 수준에서 VM 쓸 생각을 한거지??
자바는 다음과 같은 순서로 프로그램을 실행한다.
1. hello.java라는 파일을 개발자가 작성
2. `javac`로 컴파일(hello.java → hello.class)
3. 자바 가상 머신(JVM)으로 실행
→ JVM에다 올려서 실행하기 때문에 일반적인 프로그램 파일처럼 OS 독립적임
그러나 위에서 설명했던 실행과정은 JVM이 실질적으로 해주는 역할이 많이 축약됨
javac가 바이트 코드(*.class)로 컴파일을 해준 것은 기계어 수준까지는 아님

굉장히 좋은 사진을 가져옴
JVM 안에는 크게 Class Loader, Execution, Runtime Data Area로 나뉨
클래스 로더(Class Loader)
javac가 컴파일한 바이트 코드를 로드함(가져옴)
실행 엔진(Execution)
인터프리터
- 한줄한줄 읽는 거 그거
- 일반적으로 프로그래밍 언어에서 말하는 그 인터프리터 방식 맞음
JIT(Just-In-Time)
- 인터프리터 방식을 사용할 때 반복되는 코드 전체를 네이티브 코드로 컴파일하여 캐싱해뒀다가 사용해서 빨라짐 (근데 머슨 기준으로 반복되는 코드를 판단하는 지 궁금하긴함)
- 여기서 말하는 네이티브 코드란 JAVA의 부모 언어격이 되는 C/C++를 말함
- 인터프리터 방식의 단점 보완을 위해 혼용
가비지 콜렉터(Garbage Collector)
- heap 메모리 영역에서 더 사용하지 않는 메모리를 자동 회수(메모리 최적화)
- C/C++ 에서는 이러한 가비지 컬렉션이 없어 프로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야 했음 → 개발자가 메모리 릭(memory leak) 문제를 신경쓰지 않아도 되서 편리해짐
런타임 데이터 영역(Runtime Data Area)
JVM의 메모리 영역
프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
여기가 은근히 핵심.. 맛집.. 그래서 다음에 참조형 변수가 런타임 데이터 영역에 어디에 어떻게 올라가는지 설명하면서 따로 써보겠삼

2. 언어의 OS 독립성
비교를 해보려면 OS 종속성을 갖는 언어를 찾아봐야함 → C, C++
C/C++
- 프로그래밍언어 → 기계어로 바로 컴파일
- OS에서 바로 동작 가능한 형태의 코드니까 OS 종속적
Java
- 자바의 컴파일러(javac)는 OS가 바로 실행가능한 Native Code로 컴파일 X
- 바이트 코드(.class)로 우선 컴파일함. 바이트코드를 JVM에서 각 운영체제에 맞는 기계어로 변환.
어제 든 생각인데 Go 같은 언어?는 또 뭔 차이점이 있을지 좀 궁금하네요!
결론
아무리 생각해봐도 언어 수준에서 VM 도입하는 건 아름다운 발상이다.
누가 자꾸 그래서 무겁다고 뭐라하는데 그것은 "왕관의 무게", "퀸의 마인드"임.. 견뎌.
참고자료
https://inpa.tistory.com/entry/JAVA-☕-JVM-내부-구조-메모리-영역-심화편
https://doozi0316.tistory.com/entry/1주차-JVM은-무엇이며-자바-코드는-어떻게-실행하는-것인가