본문 바로가기

멋쟁이사자처럼 자바 백엔드 🦁/아기사자반

[아기사자반] 1차 과제: JVM과 자바 코드의 실행 방식

개인 공부를 위해 작성한 게시물입니다. 잘못된 정보가 포함되어 있을 수 있습니다. 

 

1. JVM (Java Virtual Machine)

JVM, 자바 가상머신은 프로그래밍 언어 자바로 쓰인 코드를 컴퓨터에서 실행할 수 있도록 기계어로 변환해주는 역할을 수행한다. 

 

* 가상 머신?

가상 머신이란 프로세스와 같이 OS로부터 메모리를 할당받아 구동되는 '컴퓨터 안의 컴퓨터'다. 
여타 프로세스와 마찬가지로 OS로부터 메모리를 할당받아 작동되지만, 호환성 문제와 같은 OS의 제약으로부터 보다 자유롭다.

2. JVM의 구성 요소

JVM은 각각 다른 역할을 수행하는 클래스 로더, 런타임 데이터 영역, 실행 엔진으로 구성된다.

 

메소드 영역 (클래스 로더)

클래스 로더는 JVM에 클래스 파일을 불러온다. 자바는 동적 로딩(Dynamic Loading) 방식을 사용하는데, 이는 필요한 클래스만 불러오기 위함이다. 클래스 로더의 작동 과정은 아래와 같다.

로딩: 클래스의 정보를 메모리에 불러온다.
링킹: 바이트코드를 검사한 후, 정적(Static) 변수들을 메모리에 할당한다. 정적변수는 한 번 할당되면 프로그램 종료 시 해제된다. 
초기화: 정적 변수를 초기화(메모리 구역을 새롭게 할당하는 개념)하고, Static 블록을 실행한다.

 

런타임 데이터 영역

OS로부터 JVM이 할당받은 메모리 영역을 말한다.

메소드 영역: 클래스의 데이터, 정적변수(Static)가 저장된다. 모든 스레드(작업을 실행하는 단위)가 공유하며, 단 하나만 존재한다.
힙(Heap) 영역: 생성된 객체와 배열이 저장된다. 단 하나만 존재하며, 객체를 공유한다.
스택 영역: 메서드 호출 시 지역변수, 매개변수 리턴 값 등을 저장한다. 스레드마다 독립적으로 존재한다.
PC 레지스터: JVM 명령의 주소값을 저장하며, 각 스레드마다 생성된다.

 

실행 엔진

바이트코드를 해석하고 실행하는 역할을 수행한다.

인터프리터: 바이트코드를 한 줄씩 읽어 해석한다.
JIT 컴파일러: 반복적으로 호출된 메서드는 바이트코드를 기계어로 변환하여 효율성을 높인다.
GC(Garbage Collector): 사용되지 않는 객체를 메모리에서 제거한다.

 

* JIT(Just-In-Time) 컴파일러?

인터프리터를 이용해 바이트코드를 처리할 경우 한줄씩 코드를 읽으며 실행된다. JIT 컴파일러는 반복적으로 호출되는 메서드를 기계어로 변환하여 실행의 효율을 높여준다. 이를 동적 번역(Dynamic Translation)이라고 부르며, 코드 재사용을 최적화한다.

3. 바이트코드

바이트코드는 소스 파일이 컴파일될 때 생성되는 반기계어를 말한다. 바이트코드는 하드웨어나 OS에 독립적으로 생성되는데,

이 덕분에 자바는 우수한 OS 호환성을 가지고 있다. 명칭에서도 드러나듯, 바이트코드는 1byte 크기의 명령어 단위로 처리된다.


4. 자바의 컴파일 방법

소스 파일을 컴파일하면 바이트코드 파일로 변환된다. JVM은 바이트코드 파일들을 기계어로 변환하여 프로그램을 실행한다.

터미널 명령어를 통해 소스 파일을 컴파일할 수 있다. test.java라는 소스 파일을 컴파일하려고 한다면, 그 방법은 아래와 같다.

 

javac test.java

 

명령어를 실행하면 test.class라는 이름으로 바이트코드 파일이 생성된다.

 


5. 자바의 실행 방법

컴파일된 바이트코드인 test.class를 실행할 때 역시 마찬가지로 터미널을 이용할 수 있다.

java test

 

확장자를 제외한 파일의 이름을 명령어와 함께 입력하면 JVM에서 바이트코드 파일이 실행되고, test.class의 main 메서드를 호출한다.

추가 매개변수(Parameter)를 불러오려면 String[] args 코드를 사용하면 된다.

 

* 매개변수?

메서드를 선언할 때 입력받을 값을 나타낸 변수이다.

6. JDK와 JRE

 

 

JRE(Java Runtime Environment)

자바 기반 프로그램을 실행하기 위한 환경을 말한다. JDK를 실행하려면 반드시 시스템에 JRE를 설치하여야 한다.

 

JDK(Java Development Kit)

자바 기반 프로그램 개발을 위한 SDK(Software Development Kit)를 말한다. 자바 프로그래밍에 필요한 모든 도구(javac, GC 등)을 포함하고 있다.