본문 바로가기
TIL : JAVA

[Java] Static, Heap, Stack 메모리

by 이페코장인 2024. 4. 25.

JVM이 프로그램을 효율적으로 가동하기 위해 메모리 공간을 Static, Stack 그리고 Heap으로 분리하여 관리한다. 각 공간은 서로 다른 특징을 가지고 있다.

 

Static 영역 (메서드 영역)

  • Static영역에 저장된 변수는 프로그램이 시작하자마자 한 번 생성이 되고, 프로그램이 종료돼야 없어진다.
  • 따로 생성을 하지 않아도 계속 사용 및 접근이 가능하다.
  • 정적 멤버 변수(static으로 선언된 class변수)가 저장된다.
  • java.lang 패키지, import한 패키지 그리고 프로그램 상의 class들이 들어간다.
  • 메모리 할당 방식이 '정적'이기에 static영역이라고 한다.

 

Heap 영역

  • 프로그램 실행 중 생성되는 모든 객체들을 저장하는 영역이다.
  • 객체 생성 시 메모리가 할당되고, 객체가 더 이상 사용되지 않으면 Garbage Collector에 의해 메모리가 해제된다. 하지만 메모리 누수가 발생할 수 있다.
  • static으로 선언되지 않은 class변수(전역 변수)가 저장된다.
  • new로 새 변수를 선언하는 것을 '인스턴스(instance)'라고 하며, 생성된 변수를 '인스턴스 변수'라고 한다. 인스턴스 변수 또한 heap에 저장된다.
  • '동적'메모리 할당 방식을 사용한다.

 

Stack 영역

  • 메서드 호출시 생성되고 해제시 소멸되는, 중괄호 {} 블럭 내부의 데이터를 저장하는 영역이다.
  • 메서드 내에서 선언된 기본 자료형 변수의 값들을 저장한다.
  • 메서드 내에서 선언된 참조 자료형 변수는 주소값이 stack에 저장되고, 데이터값은 heap에 저장되어 참조한다.
  • 지역 변수, 매개 변수 등 메서드 실행 중 생성되는 임시 데이터를 저장한다.
  • LIFO(Last In, First Out) 방식으로 데이터를 저장한다.

 

예시

public class MemoryExample {

    // 정적 변수 (정적 메모리)
    static int staticField = 10;

    public static void main(String[] args) {
        // 지역 변수 (스택 메모리)
        int localVariable = 20;

        // 객체 생성 (힙 메모리)
        MyClass myObject = new MyClass();

        // 객체 메서드 호출
        myObject.instanceMethod();

        // 스택 프레임 해제 (localVariable 해제)
    }
}

class MyClass {
    // 인스턴스 변수 (힙 메모리)
    int instanceField = 30;

    public void instanceMethod() {
        // 지역 변수 (스택 메모리)
        int localVariable = 40;

        // ...

        // 스택 프레임 해제 (localVariable 해제)
    }
}

'TIL : JAVA' 카테고리의 다른 글

[Java] ResponseEntity 를 return할 때, new를 언제 붙이는가?  (0) 2024.05.09
[Java] 선형 검색 Linear Search  (0) 2024.05.02
JDBC 로 MySQL 연결하기  (0) 2024.03.30
JDBC 기초  (0) 2024.03.28
[Java] 상속  (0) 2024.03.20