본문 바로가기
JAVA & Spring

[Java] 자바 메모리 구조 총 정리(+그림)

by 알기 쉬운 코딩 사전 2025. 1. 21.
반응형

JVM(Java Virtual Machine)

Java를 실행하기 위한 가상 컴퓨터입니다.

자바로 작성된 애플리케이션은 모두 이 가상 컴퓨터(JVM)에서만 실행되기 때문에,
자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요합니다.

 


 

자바 메모리

JVM이 애플리케이션 실행 시, 시스템(운영체제)에서 할당받아 사용하는 메모리 영역입니다.

애플리케이션이 실행되기 위해서는 메모리가 필요합니다.
JVM은 자바 메모리를 용도에 따라 여러 영역으로 나누어 관리합니다.

 


 

자바 메모리 구조

참고: 아래에서는 클래스와 인스턴스를 붕어빵 틀과 붕어빵으로 비유하겠습니다.
클래스와 인스턴스를 잘 모르신다면 그림과 코드로 아주 쉽게 정리한 클래스와 인스턴스를 참고해 주세요.

 

자바 메모리 구조 - 비유

자바의 메모리 구조는 크게 세가지로 나눌 수 있습니다.

  • 메서드 영역: 클래스 정보를 보관합니다. 이 클래스 정보가 붕어빵 틀입니다.
  • 스택 영역: 실제 프로그램이 실행되는 영역입니다. 메서드를 실행할 때 마다 하나씩 쌓입니다.
  • 힙 영역: 객체(인스턴스)가 생성되는 영역입니다. new 명령어를 사용하면 이 영역을 사용합니다.
    쉽게 이야기해서 붕어빵 틀로부터 생성된 붕어빵이 존재하는 공간입니다.
참고: 배열은 힙 영역에 생성됩니다.

 


 
위에서 설명한 내용은 이해하기 쉽게 비유로 한 것이고 실제로는 아래와 같습니다.
 

자바 메모리 구조 - 실제

 

메서드 영역(Method Area)

메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리하는 영역입니다.
이 영역은 프로그램의 모든 영역에서 공유합니다.

추가로 메서드 영역은 아래 세가지 영역으로 나눌 수 있습니다.
  • 클래스 정보: 클래스의 실행 코드(바이트 코드), 필드, 메서드와 생성자 코드등 모든 실행 코드가 존재합니다.
  • static 영역: static 변수들을 보관합니다.
  • 런타임 상수 풀: 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관합니다.
    예를 들어서 프로그램에 "hello"라는 리터럴 문자가 있으면 이런 문자를 공통으로 묶어서 관리합니다.
    이 외에도 프로그램을 효율 적으로 관리하기 위한 상수들을 관리합니다.
참고: 그림과 코드로 아주 쉽게 정리한 static변수와 static메서드

 

스택 영역(Stack Area)

실제 프로그램이 실행되는 영역입니다.
자바 실행 시, 하나의 실행 스택이 생성됩니다.


각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함합니다.
  • 스택 프레임: 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임입니다.
    메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고메서드가 종료되면 해당 스택 프레임이 제거됩니다.

 

힙 영역(Heap Area)

객체(인스턴스)와 배열이 생성되는 영역입니다.
 
가비지 컬렉션(GC)이 이루어지는 주요 영역이며,
더 이상 참조되지 않는 객체는 GC에 의해 제거됩니다.

 


 

자바 메모리에 할당되는 과정

자바에서 메서드 영역에 있는 Data 클래스로 인스턴스를 2개 생성하면, 힙 영역에는 2개의 인스턴스가 생깁니다.

 
각각의 인스턴스는 내부에 변수와 메서드를 가집니다.
같은 클래스로 부터 생성된 객체라도 내부 변수 값은 서로 다를 수 있습니다.
하지만 메서드는 공통된 코드를 공유합니다.
 
따라서 객체가 생성될 때, 인스턴스 변수에는 메모리가 할당되지만, 메서드에 대한 새로운 메모리 할당은 없습니다.
메서드는 메서드 영역에서 공통으로 관리되고 실행됩니다.
 

정리하면 인스턴스의 메서드를 호출하면 실제로는 메서드 영역에 있는 코드를 불러서 수행합니다.

반응형

댓글