minghxx.blog
  • 변수 메모리 영역
    2024년 11월 24일 23시 15분 31초에 업로드 된 글입니다.
    작성자: 민발자
    728x90

    변수의 종류와 저장위치

    • Java에서 변수가 메모리에 저장되는 과정은 JVM의 메모리 구조와 밀접한 관련
    • 자바의 메모리는 크게 메소드 영역, 힙 영역, 스택 영역, PC 레지터스, 네이티브 메소드 스택으로 구성
    • 변수가 저장되는 주요 영역은 스택과 힙 영역

    1. 변수의 종류와 저장 위치

    1. 지역 변수
      • 저장 위치 : 스택 영역
      • 메서드나 블록 내부에 선언된 변수
      • 메서드 호출 시 스택에 생성, 호출이 끝나면 메모리에서 제거
      • 기본 자료형은 값을 직접 저장
      • 참조 자료형은 힙 영역에 저장된 객체 주소를 저장
    2. 인스턴스 변수
      • 저장 위치 : 힙 영역
      • 클래스 객체(instance)가 생성될 때 힙에 저장
      • 객체가 소멸되면 GC(Garbage Collector)에 의해 제거
      • 각 객체가 고유한 값을 가집
    3. 클래스 변수
      • 저장 위치 : 메소드 영역
      • 클래스 로드 시 메모리에 저장
      • 프로그램이 종료될 때까지 메모리에 유지
      • 모든 객체가 공유

    2. 메모리 구조와 변수 저장 과정

    1. 메서드 영역
      • 클래스 로드 시 메타데이터
      • 클래스 변수(static 변수)
      • 메서드 코드(바이트코드)
    2. 스택 영역
      • 지역 변수와 메소드 호출 스택 프레임(call stack)
      • 메서드가 호출되면 새로운 스택 프레임이 생성, 지역 변수는 스택 프레임에 저장
      • 메소드가 종료되면 스택 프레임과 변수는 제거
    3. 힙 영역
      • new 키워드로 생성된 객체와 배열
      • 인스턴스 변수
      • 객체가 생성되면 힙에 메모리가 할당(필요한 메모리를 계산해서 요청해 할당됨)
      • 참조 변수는 힙의 객체 주소를 스택에 저장

    3. 예제

    public class MemoryExample {
        static int staticVar = 10; // 클래스 변수 (Method Area)
    
        public static void main(String[] args) {
            int localVar = 20; // 지역 변수 (Stack)
            Example obj = new Example(); // 참조 변수 (Stack)와 객체 (Heap)
    
            obj.instanceVar = 30; // 인스턴스 변수 (Heap)
            obj.display(); // 메소드 호출 -> 새로운 스택 프레임 생성
        }
    }
    
    class Example {
        int instanceVar; // 인스턴스 변수 (Heap)
    
        void display() {
            int methodVar = 40; // 지역 변수 (Stack)
            System.out.println("methodVar: " + methodVar);
        }
    }
    
    1. 클래스 로드:
      • MemoryExample 클래스 로드 시 staticVar가 메소드 영역에 저장
    2. main 메소드 호출:
      • 스택 영역에 main 메소드의 스택 프레임이 생성
      • 지역 변수 localVar = 20이 스택에 저장
      • 참조 변수 obj가 생성되고, 이는 힙에 생성된 Example 객체를 참조
    3. 객체 생성:
      • new Example()로 생성된 객체는 에 저장
      • obj는 객체의 주소를 스택에 저장
      • 객체의 인스턴스 변수 instanceVar가 에 저장
    4. display 메소드 호출:
      • 스택 영역에 새로운 스택 프레임이 생성
      • methodVar = 40은 스택에 저장
      • 메소드 종료 시, 스택 프레임과 지역 변수는 제거

    4. 정리

    • 스택 영역: 메소드 호출과 지역 변수 저장
    • 힙 영역: 객체와 인스턴스 변수 저장
    • 메소드 영역: 클래스와 static 변수 저장
    • 변수 저장 과정은 코드의 실행 흐름에 따라 스택과 힙에서 동적으로 변화

     

    스택 프레임과 GC의 역할 차이

    1. 메서드 호출로 생성된 스택 프레임은 CG로 제거?
      • JVM의 스택 관리 메커니즘에 의해 자동으로 처리
    2. 스택 프레임과 GC
      • 스택 프레임 관리스택은 메모리를 자동으로 관리하는 LIFO 구조
      • 메서드가 호출되면 스택에 스택 프레임 생성, 종료되면 해당 스택 프레임이 자동으로 제거
      • 지역 변수, 메서드 호출 정보(매개변수, 반환 주소 등) 저장
      • 힙 영역과 GCGC는 힙 영역에서 더 이상 참조되지 않는 객체를 정리하는 역할
      • 스택과 달리 힙은 명시적으로 메모리를 할당, GC가 해당 메모리를 회수할 때까지 유지됨
      • GC는 객체나 배열과 같은 힙 메모리에만 영향
    3. GC는 왜 스택 프레임을 관리하지 않을까?
      • GC는 동적으로 생성된 객체를 관리
      • 스택 프레임과 그 안의 변수는 메모리 구조상 짧은 생명 주기를 가지고 명확한 생성-제거 시점이 있으므로 GC로 관리하지 않음 

     

    728x90
    댓글