본문 바로가기

Java

[Java] 이것이 자바다 - JVM

JVM 이란?

운영체제는 자바 프로그램을 바로 실행할 수 없는데 그 이유는 자바 프로그램은 완전한 기계어가 아닌 중간단계의 바이트 코드이기 때문에 이것을 해석하고 실행할 수 있는 가상의 운영체제가 필요하다. 이때 사용되는 것이 자바 가상 기계 JVM(Java Virtual Machine)이다.

 

바이트 코드는 모든 JVM에 동일한 실행 결과를 보장하지만 JVM은 운영체제에 종속적이다. 그래서 JVM은 운영체제에 맞게 설치 되어야 하는데 JDK(Java Development Kit)나 JRE(Java Runtime Envirenment)를 설치할때 자동으로 설치되며 JDK와 JRE가 운영체제에 맞게 제공된다.

 

JVM이 시작되면 JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)을 다음과 같이 메소드 영역, 힙영역, 스택영역으로 나누어서 사용한다.

JVM 동작 순서

1. JAVA 컴파일러가 자바 소스 파일(.java)을 바이트 코드(.class)로 변환한다.

2. 변환된 바이트 코드가 클래스 로더를 통해 JVM으로 로드된다.

3. 로드된 바이트 코드는 Runtime Data Area의 각 영역에 배치된다.

4. Execution Engine에 의해 해석되어 실행된다.

메소드(Method) 영역

메소드 영역에는 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 상수풀, 필드, 데이터, 메소드 데이터, 메소드 코드, 생성자 코드등을 분류해서 저장한다. 메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.

힙(Heap) 영역

힙 영역은 객체와 배열이 생성되는 영역이다. 힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조하고 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 GC(Garbage Collector)에 의해 제거된다.

스택(Stack) 영역

스택 영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다. 기본 타입(boolean, char, byte, short, int, long, float, double)의 값과 변수를 저장하고, 참조 타입의 변수와 힙 영역이나 메소드 영역의 객체 주소를 저장한다.

 

참고로 기본 타입 변수(boolean, char, byte, short, int, long, float, double)는 변수와 값을 전부 스택영역에서 갖고 있지만 참조 타입 변수의 경우에는 변수(name, hobby)는 스택 영역에서 값("key", "독서")은 힙 영역에서 갖고 스택 영역의 변수가 힙 영역의 값의 메모리 주소를 갖고 참조한다.

// 기본 타입 변수
int age = 25;
double price = 100.5;

// 참조 타입 변수
String name = "key";
String hobby = "독서";