[Java] JVM의 메모리 구조

이상현·2025년 11월 19일

Java

목록 보기
24/25
post-thumbnail

JVM?

일반적인 프로그래밍 언어는 한 운영체제에 맞게 개발된 프로그램을 다른 종류의 운영체제에 적용하기 위해서 노력이 필요했다.

하지만 자바는 JVM 이라는 가상 머신하고만 통신한다. JVM이 자바로부터 전달받은 명령을 해당 운영체제가 이해할 수 있도록 변환하여 전달한다.

자바는 초기에 냉장고와 같은 여러가지 가전제품에서 실행되기 위해 개발되었다. 그래서 하드웨어에 종속적이지 않은 프로그램 실행 방법이 필요헀다.

물론 JVM은 운영체제에 종속적이다. 여러 운영체제에 설치할 수 있는 서로 다른 버전의 JVM을 제공한다.

그래서 자바로 작성된 프로그램은 JVM만 있다면 운영체제나 하드웨어에 상관없이 실행 가능하다.

JVM의 메모리구조

프로그램이 실행되면 JVM은 시스템으로부터 프로그램을 수행하는 데 필요한 메모리를 할당받고 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

Java는 실제 물리 메모리를 직접 사용하는 것이 아니라 JVM이 관리하는 메모리 공간을 사용하므로, 개발자가 인식하는 메모리 영역의 용어나 구조는 일반적인 OS 레벨 메모리 구조와 다르게 보인다

그 중 3가지 주요 영역에 대해서 알아보자.

1. Method Area

자바 프로그램 실행 중 어떤 클래스가 사용되면 JVM은 해당 .class 파일을 읽어 분석하여 클래스 데이터와 변수같은 클래스 메타데이터를 이곳에 저장한다.

Metaspace 기반이며 native memory 를 직접 사용한다.
또한, Static 변수들은 이곳에 저장된다.

2. Heap

인스턴스 (객체) 가 생성되는 공간이다. 모든 인스턴스 변수는 이곳에 생성된다. GC는 주로 이 공간의 객체를 대상으로 이루어진다.

GC 에 대한 게시글: 자바는 메모리 관리를 어떻게 할까 그리고 왜 그렇게 할까?

3. Call Stack

메서드의 작업에 필요한 메모리 공간이다. 메서드가 호출되면 이곳에 그 메서드를 위한 메모리가 할당되며 메서드에서 사용되는 지역변수, 매개변수 등과 연산 결과 등을 저장하는데 상요된다. 작업을 마치면 메모리공간이 반환된다.

스택 영역은 스레드마다 독립적으로 존재하고, 사용과 반환이 명확하기 때문에 GC의 대상이 아니다.

가끔 프로그래밍 실수로 재귀함수를 종료 조건 없이 호출하여 StackOverflowError 를 본 적이 있다면 이곳이 가득 찬 것이다.

이름이 스택인 만큼, 첫 번째로 호출된 메서드를 위한 작업 공간이 호출 스택의 맨 밑에 할당되고, 첫 번째 메서드 수행 중에 다른 메서드를 호출하게 되면 바로 위에 두 번째로 호출된 메서드를 위한 공간이 마련된다.

이 때 첫 번째 메서드는 수행을 멈추고 두 번째 메서드가 수행된다. 호출스택 상의 제일 상위에 위치하는 메서드가 현재 실행 중인 메서드이며, 나머지는 대기 상태로 기다린다.

0개의 댓글