JVM에 대해 이해하려면 CS이론 OS, Virtual Memory에 대해 알아야 한다.
JVM 기본이론
- JVM
- Process.
- java.exe 파일을 실행시켜 그 위에서 내가 만든 프로그램이 실행되는 것.
- 기본적인 의미는, Virtual Machine.

컴퓨터의 기본 구조
- (1) 하드웨어(Physical)
- CPU (Machine): 기계어(Machine code)를 이해하고 실행
- RAM, SSD 등의 물리적 저장장치
- 소프트웨어
- (2) 애플리케이션 영역: 사용자 프로그램
- (3) 시스템 소프트웨어 영역: 운영체제(OS)와 그 핵심인 커널
상단의 User 영역: 일반 프로세스들이 실행
하단의 Native 영역: OS와 H/W가 위치
CPU: 최하단에서 실제 머신 코드를 실행
네이티브 코드 개발의 이해
- 개발 언어와 실행
- C/C++ 기반 개발
- 네이티브 영역: OS와 H/W가 위치
- 고급언어를 머신 코드로 직접 번역
- CPU에서 직접 실행되는 구조
- 의존성 특징
- 하드웨어 의존성
- 물리적 시스템 자원에 직접 접근
- 하드웨어 구조에 따른 코드 최적화 필요
- 운영체제 의존성
- OS 환경에 직접적 의존
- 플랫폼 별 호환성 제약
- Window용 코드를 Linux/Unix로 이식하는 것이 어려움
- OS별 별도 개발 필요
(C/C++) 고급언어를 머신 코드로 직접 번역한다는 말의 의미
- C/C++ 컴파일 과정
- 소스코드가 직접 기계어로 변환되는 단일 단계 컴파일
// C/C++ 소스코드
int main() {
int a = 10;
return a;
}
↓ (컴파일)
// 직접 기계어로 변환
0101 0111 1000 0011...
- Java 컴파일 과정
- 2단계 컴파일 과정을 거침
- 1단계: 소스코드 -> 바이트 코드(.class 파일)
- 2단계: JVM이 바이트코드를 실행 시점에 기계어로 변환
public class Main {
public static void main(String[] args) {
int a = 10;
}
}
↓ (1차 컴파일)
iconst_10
istore_1
↓ (JVM 실행시점)
0101 0111 1000 0011...
Virtual Machine의 이해
- Virtual(논리적) vs Physical(물리적)
Virtual = Logical
: 소프트웨어적 구현
Physical
: 실제 하드웨어
- Machine은 CPU를 이야기하는데, 이를 하드웨어가 아니라 소프트웨어로 구현하면 Virtual Machine이 된다.
- 컴퓨터, 즉 Machine인데, 이를 소프트웨어적으로 구현한 했다, 이걸 버츄얼 머신(Virtual Machie)이라고 한다.
- 이 버추얼 머신이 인식할 수 있는 코드가 Java Byte Code이면, 이걸 JVM(Java Virtual Machine)이라고 한다.

JVM(Java Virtual Machine)
- 기본 개념
- 자바 프로그램을 실행하기 위한 소프트웨어 기반 가상 컴퓨터
- Java Byte Code를 실행하는 가상화된 런타임 환경
- 하드웨어 가상화
- CPU, RAM, SSD를 소프트웨어적으로 구현
- RAM과 SSD를 가상 메모리로 추상화 해 프로세스가 동작
- 운영체제의 기능도 일부 제공
JVM의 이해는 운영체제론(OS)과 컴퓨터 구조론의 개념을 통합적으로 파악하고, 이를 C/C++로 구현하는 방식을 이해한다는 것을 의미한다.
네이티브 vs 매니지드 코드
- 프로그래밍 언어와 메모리 관리
- 메모리 관리 방식은 언어의 핵심 특성을 결정
- 설계 철학과 장단점의 근간
- 실행 환경과 안정성에 직접적 영향
- 네이티브 코드의 특징 (C/C++)
- 실행 구조
- 하드웨어에 직접 접근하여 실행
- OS와 하드웨어의 구조에 맞춰 직접 기계어로 변환
- 위험 요소
- OS 레벨의 치명적 오류 위험
- 메모리 직접 제어로 인한 리스크
- Access Violation 발생 가능
- 매니지드 코드의 특징 (Java)
- 실행구조
.java
-> .class
(ByteCode) 변환
- JVM위에서 동작하는 유저모드 애플리케이션
- 안전성
- 프로그램 오류가 JVM 범위로 격리
- JNI(Java Native Interface) 외 OS에 직접적인 접근 불가
- 장점
- 플랫폼 독립성 보장
- Virtual Machine은 제조사마다 OS별로 만들어진다. 따라서 바이트코드로 변환이 가능하도록 자바코드만 잘 작성해주면 OS가 뭐가됐든 잘 작동하는 장점이 있다.
- 안전한 메모리 관리
- 시스템 보안 강화
Java, C++ 메모리 관리 차이

C++
- 특징
- 객체의 전체 생명주기를 개발자가 직접 관리
- 메모리 할당 (new)
- 메모리 해제 (delete)
- 객체의 소유권 관리
- 장단점
- 장점
- 가상 메모리 영역에 대한 완전한 통제 가능
- 높은 자유도와 세밀한 메모리 제어
- 직접적인 성능 최적화 가능
- 단점
Java
- 특징
- JVM의 Garbage Collector(GC)가 메모리 관리
- 참조되지 않는 객체 자동 회수
- 개발자는 객체 소유권 없음
- 메모리 해제를 신경 쓸 필요 없음
- 뷔페 시스템과 유사: 음식(객체) 사용 후 그릇을 두면, 서빙 직원(GC)이 자동으로 치움
- 제약사항
- 메모리 관리를 GC를 통해 실행
- 메모리 소유권 문제를 디테일하게 논할 수 없다.
- 가상메모리 공간의 데이터를 GC가 통제하므로, 가상 메모리 주소를 GC를 통해서만 조회할 수 있다.
- GC 오작동 시 문제 해결이 복잡
- GC 동작 구조에 대한 이해가 필요
Reference