Java 2-2 JVM 메모리 영역

토스트빌런·2025년 3월 11일

JVM 메모리 구조

📚Java 메모리 구조는 크게 3가지로 나뉩니다.

💡Java 메모리 구조 비유로 이해하기

  • Method Area(도서관 비유)
    • 프로그램 시작 시 정보가 저장됩니다.
    • 클래스 정보(.class 파일) 가 올라가는 곳.
    • 클래스의 메서드 정보, static 변수 등이 저장됩니다.
    • 모든 객체가 공유하는 공용 공간
  • Stack Area(접시 쌓기 비유)
    • 가장 위에 있는 접시를 먼저 꺼내듯 비슷한 구조로 생각하시면 됩니다.
    • 선입후출(LIFO) 구조 입니다. 먼저 들어온 것이 가장 늦게 나간다는 뜻입니다.
    • 메서드가 호출될 때마다 새로운 접시한장(스택프레임)이 쌓입니다.
    • 가장 위의 접시(최근 호출된 메서드)가 먼저 실행됩니다.
    • 메서드 실행이 끝나면 스택에서 제거됩니다.
  • Heap Area(풍선 비유)
    • new 키워드로 생성된 객체가 저장되는 곳입니다.
    • 객체의 실제 데이터가 저장되고 데이터의 주소는 stack 영역에 저장됩니다.

코드 흐름 살펴보기

❗편의상 하나의 코드파일로 제공되지만 파일 2개가 있다고 가정해 봅시다.

  • Main.java 파일 그리고 Person.java 파일

💡Java 코드 실행 시각화 도구

  • Java 코드의 실행 흐름을 시각적으로 확인하려면 아래 사이트를 이용해 보세요.

👉 Java Visualizer

코드 설명

public class Main {
    static class Person {

        // 1. 속성
        String name;
        int age;
        String address;

        // 2. 생성자
        Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        // 3-1. 소개 기능(이름 나이 출력 기능)
        void introduce() {
            System.out.println("나의 이름은");
            System.out.println(this.name + "입니다.");
            System.out.println("나의 나이는");
            System.out.println(this.age + "입니다.");
        }

        // 3-2. 더하기 기능(소개를 하고 더하기 연산 수행)
        int sum(int value1, int value2) {
            introduce();
            int result = value1 + value2;
            return result;
        }
    }

    public static void main(String[] args) {
        String name = "Steve";
        int age = 20;
        Person personA = new Person(name, age);
        personA.introduce();

        int value1 = 1;
        int value2 = 2;

        int ret = personA.sum(value1, value2);
        System.out.println(ret);
    }
}

Method(static) 이해하기

📚Method Area 이해해 봅시다.

  • 프로그램이 실행되면 여러분들이 작성했던 모든 파일(.java)의 데이터가 Method(static)영역에 저장됩니다.
  • 프로그램 실행 시점에 한번만 저장됩니다.
  • Method 영역에 저장된 데이터는 프로그램 전체에서 공용으로 활용 가능합니다.
  • 아직 static 키워드를 배우지 않았지만 static 으로 선언된 변수와 메서드들이 이 공간에 위치하게 됩니다.
  • 이 공간에 저장된 데이터는 공용으로 사용 가능합니다.

Heap 영역 이해하기

📚Heap 영역을 이해해 봅시다.

  • new 키워드로 생성된 객체는 Heap 영역에 저장됩니다.

💡프로그램 실행 흐름에서 Stack 영역의 변수가 Heap 영역의 객체를 참조(화살표→ 로 가리키고 있는 모습)을 꼭 확인해 봅시다. 지금은 객체를 담은 변수에는 실제 객체의 Heap 메모리 주소 값이 저장되는구나 라고 이해하고 넘어가셔도 충분합니다.

Stack 영역 이해하기

📚Stack 영역을 이해해 봅시다.

  • 메서드가 호출될 때마다 Stack 영역에 메모리가 할당됩니다.
  • 하나의 접시(스택프레임)에 각 메서드의 지역변수가 저장됩니다.
  • 이 영역은 접시를 쌓듯이 LIFO-후입선출 구조입니다.
  • 메서드가 시작되면 추가되고 메서드가 종료되면 사라지는 구조입니다.
  • 특정 메서드가 실행되면 해당 메서드의 정보와 변수가 Stack 에 저장되고 메서드 실행이 끝나면 그 메모리는 자동으로 제거 됩니다.
  • 메서드 내에 선언된 지역변수들이 저장되는 공간입니다.
    → 변수에 객체가 담기면 객체의 주소값이 저장됩니다.

    public class Main {
    
        public static void main(String[] args) {
            String name = "Steve"; // 1
            int age = 20;  
            Person **personA** = new Person(name, age); // personA = @100호
            personA.introduce(); // 2
        }
    }

Screenshot 2025-02-10 at 9.11.22.png

Screenshot 2025-02-10 at 9.11.51.png

📚LIFO(Last In First Out) - 후입선출

마지막에 들어온 요소가 제일 먼저 나가게 되는 구조를 뜻합니다.

0개의 댓글