[CS] JVM Memory Structure

2025. 8. 15. 10:45·CS

개요

Java는 Garbage Collector(GC)를 통해 객체의 메모리를 자동으로 관리하며, 필요시 공간을 할당하고 사용하지 않는 객체를 제거합니다. 하지만 모든 객체가 GC에 의해 즉시 수거되는 것은 아니므로, 메모리 관리 원리를 이해하는 것은 고성능 시스템 구현에 큰 도움이 됩니다. 또한 이를 잘 이해하면 문제 발생 시 원인 분석을 훨씬 수월하게 할 수 있습니다.

 

GC의 내용보다는 이번 포스팅에서의 목적은 JVM Memory의 구조를 이해하는 것입니다. 그래서 GC의 내용은 생략되고, Java Memory 구조에 대한 설명이 주가 되는 점을 참고 부탁드립니다.

 

JVM의 Memory는 총 5개의 Area로 구분되어집니다. (Method(Static), Heap, Stack, Native Method Stack, PC Registers)

 

JVM이 실행되고 나면, Java Compiler가 Java 파일을 Class 파일로 변환합니다. 이후, 생성된 .class 파일을 JVM의 ClassLoader에 게 보냅니다. .class파일을 전달받은 ClassLoader는 JVM 런타임 영역으로 로딩하여 메모리에 파일을 올리게 됩니다. 

JVM이 무엇인지와 Memory 구조에 대해 상세하게 살펴보도록 하겠습니다.

 

JVM 

  1. Java로 개발한 프로그램을 컴파일하여 만들어지는(Java Compiler에 의해) 바이트코드를 실행하기 위한 가상 머신
  2. Java 프로그램을 실행하게 되면, OS로부터 메모리를 할당받게 됩니다.
  3. OS에 종속되지 않고, 실행할 수 있습니다.

 

JVM Memory Structure

https://www.scaler.com/topics/memory-management-in-java/

 

Runtime Data Area

  • Runtime Data Area는 JVM이 OS로부터 할당받는 메모리 영역으로, Java 프로그램 실행에 필요한 .class 파일의 바이트코드, 관련 데이터, 그리고 명령어를 저장합니다.
  1. Static Area (Method Area)
  2. Heap Area
  3. Stack Area
  4. Native Method Stack: 자바 외 언어로 작성된 코드를 위한 영역
  5. PC Register: JVM의 명령어의 주소를 가지는 영역

Static (Method) Area: 프로그램을 실행하는데 필요한 공통 데이터 관리, 모든 영역에서 공유

  • 저장되는 데이터: Class 정보, Static 변수, 생성자, 메서드 코드, 런타임 상수 풀 등
  • JVM이 실행될 때 Class가 load되어 생성되는 클래스의 실행 코드(바이트 코드)를 저장합니다.
  • JVM 시작 시, 클래스 로딩과 함게 생성되고 모든 스레드에서 공유합니다.
  • JVM 종료 시, 메모리에서 해제 됩니다. 즉, 프로그램이 종료되기 전까지 메모리 상에서 존재하게 됩니다.

Stack Area: 실제 프로그램이 실행되는 영역이자 메서드를 실행할 때마다 하나씩 쌓이는 곳

  • 저장되는 데이터: 기본 자료형 (int, double, boolean, byte..), 지역변수, 매개변수, Heap 객체 참조 값
  • Stack 구조 (LIFO)
  • 메소드가 호출될 때, 메모리에서 할당되고 메서드 종료 시 메모리에서 삭제됩니다.
  • 각 Thread마다 자신만의 Stack을 갖고 있습니다. Thread는 내부적으로 Static, Heap, Stack 영역을 가집니다. Thread는 다른 Thread에 접근할 수 없지만, static, heap 영역을 공유하여 사용이 가능합니다.
  • 자바 실행 시, 하나의 실행 스택이 생성되고 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함합니다.
    • 스택 프레임: 메서드를 호출할 때 생기는 프레임

Heap Area: 객체(인스턴스)가 저장되는 영역

  • 저장되는 데이터: 참조형 데이터(String, Array, Enum, Class, Interface),  new 키워드로 생성된 인스턴스
  • 쓰레드가 몇 개든 단 하나의 영역에서만 존재합니다.
  • GC에 의해서 메모리에서 해제되므로, Stack 영역과는 다르게 호출이 종료돼도 삭제되지 않습니다. 

Native Method Stack

  • 자바 외 언어로 작성된 코드를 저장하기 위한 영역

PC Register

  • JVM의 명령어의 주소를 가지는 영역

 

Method 영역과 Heap 영역간의 관계

인프런 김영한님 자료

  • Data라는 인스턴스 생성 시, 힙 메모리에 각각의 인스턴스가 생깁니다.
  • 각각의 인스턴스는 내부적으로 변수, 메서드를 가집니다.
  • 같은 클래스로부터 생성된 객체라도, 인스턴스 내부 변수 값은 서로 다를 수 있지만 (위의 value=10, value=20 처럼), 메서드에 대한 새로운 메모리 할당은 없습니다.
    • 즉, 메서드는 메서드 영역에서 공통으로 관리되고 실행됩니다.
    • 인스턴스의 메서드를 호출하면, 메서드 영역에 있는 코드를 불러서 사용하게 됩니다.

 

지금까지 Java 메모리 구조와 각 영역의 역할, 그리고 Method 영역과 Heap 영역의 관계를 알아보았습니다.
마지막으로, 전체 흐름을 정리하는 의미에서 Java 변수의 종류와 생명주기를 살펴본 뒤 포스팅을 마무리하겠습니다.

 

Java 변수 종류

public class Variable { 
    public static int a = 20; // 클래스 변수(전역 변수)
 
    int b = 60; // 인스턴스 변수(전역 변수)
    
    public static void main(String[] args) { // 매개변수(파라미터)
        int c = 50; // 지역변수
    }
}
변수 종류 선언 위치 설명 생성 시기 소멸 시기 저장 메모리
클래스 변수 클래스 영역 static이 붙고 여러 객체에서 공통 사용 클래스가 메모리에 올라갈 때 프로그램 종료시 static
인스턴스 변수 클래스 영역 클래스 영역에서 static이 아닌 경우 인스턴스 생성시 인스턴스 소멸시 heap
지역 변수 메서드 영역 메서드 내부에서 선언 블록 내의 변수의 선언문 실행시 블록을 벗어날 때 stack

 

큰 틀에서 보면, static 키워드의 유무로 구분할 수 있습니다.

 

클래스 변수: static이 붙은 멤버 변수

  • 클래스 변수, 정적 변수, static 변수 등으로 부른다.
  • static이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근해서 사용이 가능합니다.
  • 클래스 변수는 자바 프로그램을 시작할 때 딱 1개가 만들어집니다.
  • static 영역이 관여합니다.

인스턴스 변수: static이 붙지 않은 멤버 변수

  • static이 붙지 않은 멤버 변수는 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있습니다. 따라서 인스턴스 변수라고 합니다.
  • 인스턴스 변수는 인스턴스를 만들 때 마다 새로 만들어집니다.
  • heap 영역이 관여합니다.

지역 변수: 메서드/생성자/블럭 내부에 존재하는 변수

  • 블록 실행 중에만 존재하고, 호출이 끝나면 Stack 메모리에서 제거됩니다.
  • stack 영역이 관여합니다.

 

변수와 생명주기

  • 클래스 변수: 클래스 변수는 메서드 영역의 static 영역에 보관되는 변수입니다. 메서드 영역은 프로그램 전체에서 사용하는 공용 공간. 클래스 변수는 해당 클래스가 JVM이 로딩되는 순간 생성되고, JVM이 종료될 때까지 생명주기가 이어집니다.
  • 인스턴스 변수: 인스턴스에 있는 멤버 변수를 인스턴스 변수라고 합니다. 인스턴스 변수는 힙 영역에서 사용됩니다. 힙 영역은 GC가 발생하기 전까지 생존하기에 생존 주기가 짧습니다.
  • 지역 변수(매개변수): 지역 변수는 스택 영역에 있는 스택 프레임 안에 보관됩니다. 메서드가 종료되면 스택 프레임도 제거가 되는데, 해당 스택 프레임에 포함된 지역변수도 함께 제거됩니다. 따라서 지역 변수는 생존 주기가 짧습니다.

 

 

<참고 자료>

https://www.scaler.com/topics/memory-management-in-java/

 

What is Memory Management in Java? - Scaler Topics

Memory management in Java refers to the process of allocating and freeing up space for objects. Java automatically manages memory.

www.scaler.com

 

저작자표시 비영리 변경금지 (새창열림)

'CS' 카테고리의 다른 글

[CS] clustered Index, non-clustered Index  (4) 2025.08.27
[Java] Functional Interface  (5) 2025.08.26
[Tomcat] Tomcat의 핵심 컴포넌트와 동작 과정에 대해 분석해보자  (7) 2025.08.09
[Architecture] MSA (vs MA)  (1) 2024.10.22
[CS] HTTP, HTTPS의 개념과 차이점에 대해 알아보자  (0) 2023.12.01
'CS' 카테고리의 다른 글
  • [CS] clustered Index, non-clustered Index
  • [Java] Functional Interface
  • [Tomcat] Tomcat의 핵심 컴포넌트와 동작 과정에 대해 분석해보자
  • [Architecture] MSA (vs MA)
SeungbeomKim
SeungbeomKim
[IT(PS, CS, SW, etc.) 지식 기록] Github : https://github.com/daily1313/
  • SeungbeomKim
    개발 블로그
    SeungbeomKim
  • 전체
    오늘
    어제
    • 분류 전체보기 (400)
      • 일상 (33)
        • 여행 (17)
        • 회고록 (9)
        • 리뷰 (7)
      • PS (138)
        • 그리디 알고리즘[Greedy] (25)
        • 정렬 알고리즘[Sort] (18)
        • 문자열 알고리즘[String] (14)
        • 동적 계획 알고리즘[DP] (17)
        • 깊이 우선 탐색, 너비 우선 탐색[DFS, BFS.. (34)
        • 재귀[Recursion] (2)
        • 백트래킹[Backtracking] (5)
        • 브루트포스 알고리즘[Bruteforce] (16)
        • 자료 구조[Data Structure] (4)
        • 분할 정복 알고리즘[Divide & Conquer.. (3)
      • CS (29)
      • Network (11)
      • Database (8)
        • Elasticsearch (3)
      • Linux (2)
      • JavaScript (4)
        • AngularJS (1)
      • Java (100)
        • Effective Java (9)
        • Java Concept (21)
        • Spring (61)
        • Design Pattern (4)
      • Python (2)
      • Vscode (1)
      • DevOps (44)
        • AWS (27)
        • Git (7)
        • Docker (7)
        • Nginx (1)
      • 자격증 (10)
        • SQL (4)
      • 사이드 프로젝트 (3)
        • MatJido (3)
      • 기타 (9)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 소개
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    springboot
    다이나믹 프로그래밍
    정보처리기사 필기
    AWS
    정보처리기사 실기
    docker
    정보처리기사
    컴퓨터구조
    dfs
    sqld
    이펙티브 자바
    일본여행
    dp
    너비 우선 탐색
    Wi-Fi
    BFS
    메타코딩
    Effective Java
    백트래킹
    Spring
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
SeungbeomKim
[CS] JVM Memory Structure
상단으로

티스토리툴바