[java] 자바 메모리 구조 - 김영한~자바

2025. 9. 19. 23:17·공부일기../Java

인트로

자바기초 다시 한번 볼 심산으로 예전에 사두었던 인프런..강의를 다시 켜봤다..하하

듣고 대강 정리를 해봤습니다~

 

김영한짱.. 천재야 증말~

자바듣다가 다른강의도 사버렷다 하하 나 이제 강의를 .. 편의점에서 초코바 사듯이 사서 이제 완강할 일만 남았네요ㅠ

 

 


 

1. 자바 메모리 구조 개요

자바의 메모리는 크게 3개 영역으로 나뉜다.

메서드 영역 (Method Area)
├── 클래스 정보 (바이트코드, 메서드, 생성자)
├── static 변수들
└── 런타임 상수 풀

스택 영역 (Stack Area)  
├── 지역 변수
├── 매개변수
└── 메서드 호출 정보 (스택 프레임)

힙 영역 (Heap Area)
├── 객체 (인스턴스)
├── 배열
└── 인스턴스 변수들

 

비유

  • 메서드 영역: 학교의 교무실 (모든 학생이 공유하는 정보)
  • 스택 영역: 개인 책상 (개인적인 작업 공간, 수업 끝나면 정리)
  • 힙 영역: 사물함 (개인 소유물들, 졸업할 때까지 유지)

 


 

2. static 키워드

static은 정적이라는 뜻으로, 객체 생성 없이 사용할 수 있는 클래스 레벨의 멤버를 만들 때 사용한다.

 

2-1. 기본 개념

public class Student {
    // 인스턴스 변수 (각 학생마다 다름)
    String name;
    int age;
    
    // static 변수 (모든 학생이 공유)
    static String schoolName = "자바고등학교";
    static int totalStudents = 0;
    
    // 인스턴스 메서드
    public void study() {
        System.out.println(name + "이 공부합니다.");
    }
    
    // static 메서드
    public static void printSchoolInfo() {
        System.out.println("학교명: " + schoolName);
    }
}

2-2. 사용 방법

// static 멤버는 클래스명으로 직접 접근
Student.schoolName = "코딩고등학교";
Student.printSchoolInfo();

// 인스턴스 멤버는 객체 생성 후 접근
Student student1 = new Student();
student1.name = "김자바";
student1.study();

 

 


 

3. 메모리 영역별 상세 분석

3-1. 메서드 영역 (Method Area)

특징: 프로그램 전체에서 공유, 프로그램 시작부터 종료까지 유지

public class MethodAreaExample {
    static int globalCounter = 0;        // 메서드 영역에 저장
    static String appName = "MyApp";     // 메서드 영역에 저장
    
    static {
        System.out.println("클래스 로딩 시 실행");  // static 블록도 메서드 영역
    }
}

 

메서드 영역에 저장되는 것들:

  • 클래스의 바이트코드
  • static 변수들
  • 메서드 정보
  • 런타임 상수 풀
  • static 블록

3-2. 스택 영역 (Stack Area)

특징: LIFO 구조, 메서드 호출 시 생성, 종료 시 제거

public class StackExample {
    public void method1() {
        int a = 10;          // 스택에 저장
        method2(a);          // 스택 프레임 추가
    }                        // method1 스택 프레임 제거
    
    public void method2(int param) {  // param도 스택에 저장
        String local = "지역변수";     // 스택에 저장
    }                                 // method2 스택 프레임 제거
}

 

스택 영역의 특징:

  • 메서드 호출 시마다 스택 프레임 생성
  • 지역 변수, 매개변수 저장
  • 메서드 종료 시 자동으로 정리
  • 스레드별로 독립적인 스택 공간

3-3. 힙 영역 (Heap Area)

특징: 객체와 배열 저장, GC가 관리

public class HeapExample {
    String instanceVar;      // 인스턴스 변수 (힙 영역)
    
    public static void main(String[] args) {
        HeapExample obj = new HeapExample();  // 객체는 힙에 생성
        obj.instanceVar = "힙 영역 데이터";
        
        int[] array = new int[10];            // 배열도 힙에 생성
    }
}

 

힙 영역의 특징:

  • 모든 객체와 배열이 저장
  • 인스턴스 변수들이 여기에 위치
  • GC(가비지 컬렉션)가 자동으로 메모리 관리
  • 모든 스레드가 공유

 


 

 

4. 메모리 영역 구분 실습

4-1. 코드로 이해하기

public class MemoryExample {
    static String className = "MemoryExample";    // 메서드 영역
    String instanceName = "인스턴스";              // 힙 영역 (인스턴스 변수)
    
    public void testMethod(int param) {           // param: 스택 영역
        int localVar = 100;                       // 스택 영역
        String[] array = new String[5];           // 배열: 힙 영역
        
        // 새 객체 생성
        MemoryExample newObj = new MemoryExample(); // 객체: 힙 영역
        newObj.instanceName = "새 인스턴스";          // 힙 영역
    }
}

4-2. 변수별 생명주기

public class LifeCycleExample {
    static int staticVar = 1;     // 프로그램 시작 ~ 종료 (가장 긴 생명주기)
    int instanceVar = 2;          // 객체 생성 ~ GC (중간 생명주기)
    
    public void method() {
        int localVar = 3;         // 메서드 시작 ~ 종료 (가장 짧은 생명주기)
        
        // localVar는 메서드 종료 시 스택에서 제거
        // instanceVar는 객체가 GC될 때까지 힙에 유지  
        // staticVar는 프로그램 종료까지 메서드 영역에 유지
    }
}

 

 


 

5. 메모리 구조 이해 ~퀴즈~ 

5-1. 메모리 영역 구분

다음 변수들이 저장되는 메모리 영역을 맞춰바

public class MemoryQuiz {
    static String className = "MemoryQuiz";    // A) ?
    String instanceName;                       // B) ?
    
    public void method(int parameter) {        // C) ?
        int localVar = 100;                    // D) ?
        String[] array = new String[5];        // E) 배열 객체는 ?
    }
}

 

정답:

  • A) 메서드 영역 (static 변수)
  • B) 힙 영역 (인스턴스 변수)
  • C) 스택 영역 (매개변수)
  • D) 스택 영역 (지역변수)
  • E) 힙 영역 (배열 객체)

5-2. 메모리 할당 흐름 이해하기

public class MemoryFlow {
    static int count = 0;        // 1. 프로그램 시작 시 메서드 영역에 할당
    
    public static void main(String[] args) {  // 2. main 스택 프레임 생성
        String name = "자바";                  // 3. 스택에 지역변수 생성
        MemoryFlow obj = new MemoryFlow();    // 4. 힙에 객체 생성
        obj.process(10);                     // 5. process 스택 프레임 생성
    }
    
    public void process(int value) {         // 6. 매개변수 스택에 저장
        int result = value * 2;              // 7. 지역변수 스택에 저장
    }                                        // 8. process 스택 프레임 제거
}                                            // 9. main 스택 프레임 제거

 

 

 

 

마무리

자바 메모리 구조의 3영역을 이해하면

  • 메모리 효율적인 코드 작성 가능
  • 메모리 누수 원인 파악 가능
  • 성능 최적화 방향 결정 가능
  • 디버깅 능력 향상

 

'공부일기.. > Java' 카테고리의 다른 글

[java] static 제대로 활용하기 - 패턴과 함정  (0) 2025.09.21
[java] static 키워드 - 제약사항~  (0) 2025.09.20
[Java] JDK 그놈의 환경변수 설정하는 이유 정리~  (0) 2025.09.07
[JUnit5] @EnabledIfEnvironmentVariable 이해하기  (0) 2025.09.05
[동시성] 자바 동시성 문제 정리: synchronized, DB 락, Redis 분산락 비교  (5) 2025.08.16
'공부일기../Java' 카테고리의 다른 글
  • [java] static 제대로 활용하기 - 패턴과 함정
  • [java] static 키워드 - 제약사항~
  • [Java] JDK 그놈의 환경변수 설정하는 이유 정리~
  • [JUnit5] @EnabledIfEnvironmentVariable 이해하기
s0-0mzzang
s0-0mzzang
공부한것을 기록합니다...
  • s0-0mzzang
    승민이의..개발일기..🐰
    s0-0mzzang
  • 전체
    오늘
    어제
    • 전체~ (108)
      • 마음가짐..! (10)
      • 공부일기.. (76)
        • weekly-log (6)
        • Spring (19)
        • Java (18)
        • DataBase (10)
        • git (2)
        • JPA (6)
        • kafka (1)
        • Backend Architecture (3)
        • Troubleshooting (삽질..ㅋ) (2)
        • Cloud (1)
        • Docker (2)
        • 알고리즘 (1)
        • 리액트 (2)
        • Infra (3)
      • 하루일기.. (22)
        • 그림일기 (8)
        • 생각일기 (14)
  • 블로그 메뉴

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

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    spring
    Paging
    spring boot
    항해99
    swagger
    TDD
    SpringBoot
    리팩토링
    MySQL
    스프링부트
    ERD
    BufferedReader
    React
    StringTokenizer
    JPA
    항해플러스
    자바
    ADC 환경
    인프라 기초
    다짐
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s0-0mzzang
[java] 자바 메모리 구조 - 김영한~자바
상단으로

티스토리툴바