본문 바로가기

Java

Java 메모리 - Stack, Heap, Method(Static)

앞선 포스팅으로 조금씩 들어는 봤을 거다. 이것만 보는 사람들도 있을 텐데 복습하는 마음가짐으로 정리해 보자.

 

자바 프로그램이 실행되면 JVM(자바 가상 머신)은 os에게 메모리를 할당받게 된다. 크게 Stack과 Heap으로 나뉜다. 데이터 타입에 따라 다르게 할당되는데, 변수 종류부터 알아야 한다.

변수명 선언위치  
클래스 변수 (static 변수) 클래스 영역 클래스 영역에서 static이 붙는 변수, 객체를 공유하는 변수
인스턴스 변수 static이 아닌 변수, 개별적인 저장 공간으로 객체/인스턴스 마다 다른 값 저장 가능 
지역 변수 메서드 영역 메서드 내에 선언되고 메서드 수행이 끝나면 소멸되는 변수
매개 변수 메서드 호출 시 전달되는 값을 가지고 있는 변수

 

변수의 생성 시기는 

클래스 변수 - 클래스가 메모리에 올라갈 때

인스턴스 변수 - 인스턴스가 생성될 때

지역변수 / 매개변수 - 위치하고 있는 메서드가 수행되었을 때 

 

Method 영역

  • 정적 메모리 영역으로 JVM이 시작될 때 생성되며 프로그램이 종료할 때까지 존재한다.
  • 클래스 로더가 로드한 클래스 구조의 정보를 저장한다.
  • 상수 값을 저장하는 공간이다. (문자열 리터럴과 같은 상수)
  • 전역 변수정적 변수(static)가 저장된다.
  • 모든 스레드가 공유하는 메모리 영역이다.
더보기

상수와 리터럴

상수와 리터럴 모두 변하지 않는 값(데이터)을 의미한다. 하지만 상수는 변하지 않는 변수이고, 리터럴은 변수에 넣는 변하지 않는 데이터를 의미한다. 변수는 메모리에 저장된 주소값을 저장하고 있다 했잖아요? 즉 주소값이 변하지 않는다는 거지 그 안의 데이터들은 상수가 아닙니다. 만약 안의 데이터들이 변하지 않는다면 그건 리터럴이라고 합니다. 자바의 String을 예시로 들 수 있겠네요.  

Heap 

  • 객체와 배열이 동적으로 할당되는 공간이다.
  • 인스턴스 변수가 저장된다.
  • 프로그램 실행 중 동적으로 할당된 메모리 공간을 관리한다.
  • 가비지 컬렉션에 의해 자동으로 관리된다. -> 더 이상 참조되지 않는 객체를 찾아 제거하여 메모리를 회수한다.
  • 모든 스레드가 공유하는 메모리 영역이다.

Stack

  • 각 스레드마다 별도의 스택이 존재한다.
  • 메서드 호출, 지역 변수, 매개변수, 리턴 값 등을 저장한다.

역시 예시 코드 하나 보는게 이해가 제일 빠를 거다.

public class Example {
    // 정적 변수 (Method Area에 저장됨)
    public static int staticVar = 10;

    // 인스턴스 변수 (Heap에 저장됨)
    public int instanceVar;

    public static void main(String[] args) {
        // 지역 변수 (Stack에 저장됨)
        int localVar = 20;

        // 객체 생성 (Heap에 저장됨)
        Example obj = new Example();
        obj.instanceVar = 30;

        // 메서드 호출 (Stack에 저장됨)
        obj.display(localVar);
    }

    public void display(int param) {
        // 또 다른 지역 변수 (Stack에 저장됨)
        int anotherLocalVar = 40;
        System.out.println(param + anotherLocalVar);
    }
}

 


 

참고 출처

☕ 그림으로 보는 자바 코드의 메모리 영역(스택 & 힙) (tistory.com)

 

☕ 그림으로 보는 자바 코드의 메모리 영역(스택 & 힙)

자바의 메모리 영역 이번 포스팅에선 자바(JAVA)를 사용하는 입장에서 알아야 할 메모리 구조 및 특징에 대해서 알아보려고 한다. 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모

inpa.tistory.com