JAVA

자바 메모리 구조

silver-w 2025. 7. 1. 20:36

□ JVM 실행 순서

.java → .class → 메모리(ClassLoader → 런타임 영역)

 

  1. .java 파일을 컴파일러를 통해 바이너리 형태인 .class 파일로 변환
  2. .class 파일을 JVM 의 ClassLoader에게 보낸다.
  3. ClassLoader에서 클래스 파일을 JVM 런타임 영역으로 로드하여 메모리에 올린다. 



□ JVM의 런타임 영역

 - 메모리 영역들을 실행 시점(runtime)에 구성

 - JVM은 OS로 부터 메모리를 할당 받고, 할당 받은 메모리를 자바 프로그램에 맞게 여러개의 영역으로 나누어 사용한다.

public class Memorys {
	public static int number = 0;	// static 변수   [Static 메모리]
    String str = "";				// 인스턴스 변수 [주소 - Stack 영역 / 주소값 - Heap 메모리]
    
    public static void main(String[] args) {
    	int local = 0;				// 지역 변수	 [Stack 메모리]
    }
}

 

  • Static(Method) 영역

     - JVM이 실행될 때 생성되며, JVM 종료 시 메모리에서 해제된다. → 자원관리 필요
     - Class 정보, Static 변수, 생성자, 메서드 저장
     - 어디서든 접근이 가능
  • Heap 영역
     - 객체가 생성(new)할 때 저장되고, 호출이 종료되도 삭제되지 않는다. (GC대상)
     - 참조형 데이터 타입이 저장된다. (String, Integer, 배열, enum, class, interface 등)
      ※ 참조형 데이터의 주소값은 Stack영역에 있으며, 주소값에서 가르키는 값은 Heap 영역에 존재한다.
     - 쓰레드가 몇개가 존재 하든, 하나의 Heap 영역만 존재한다.
  • JVM Stack 영역 

     - 기본 자료형, 지역변수, 매개변수가 저장되는 메모리
     - new 생성자 호출 시, 데이터의 참조값이 할당.
     - 메소드가 호출될 때 메모리에 할당, 메서드 종료시 메모리에서 삭제
     - 스레드 마다 Stack 영역 1개 씩 가진다.


 § Stack 영역 vs Heap 영역 

public class StackHeap {
	public static void main(String[] args) {
    	Person p = new Person();
        int age = 25;
    }
}

 

  Stack  Heap 
int age 값 25 저장 ❌ 없음
Person p Person 객체의 참조값(주소) 저장 new Person() 실제 객체 생성됨

 

 

□ Stack 영역과 - LIFO 

public class Main {

   public static void main(String[] args) {
        main1();
   }

   static void main1() {
       System.out.println("main1 start");
       main2();
       System.out.println("main1 end");
   }
   static void main2() {
       System.out.println("main2 start");
       System.out.println("main2 end");
   }

}

 

 

 

 

 

[호출]

(1) 처음 자바 실행 시, main() 스택 프레임 생성

(2) method1() 호출 시, method1() 스택 프레임 생성

(3) method2() 호출 시, method2() 스택 프레임 생성

[종료]

(3) method2() 스택 프레임 제거 → method2()를 호출한 지점( method1() 스택프레임 )으로 돌아간다.

(2) method1() 스택 프레임 제어 → method1()을 호출한 지점( main() 스택 프레임 ) 으로 돌아간다

(1) main() 종료 → 더 이상 호출할 메서드가 없어 스택 프레임이 비워지며 자바 종료

 

 - 자바는 스택 영역을 사용해서 메서드 호출과 지역 변수(매개변수 포함)를 관리한다.
 - 메서드를 계속 호출하면 스택 프레임이 계속 쌓인다.
 - 지역 변수(매개변수 포함)는 스택 영역에서 관리한다.
 - 스택 프레임이 종료되면 지역 변수도 함께 제거된다.
 - 스택 프레임이 모두 제거되면 프로그램도 종료된다.

 

□ 스택영역과 힙 영역 .... (이어서)