Java/문법

[JAVA 중급 스터디 - 3회차] 자바의 메모리 구조

soowitty 2024. 3. 9. 17:14

 

 

스택/힙/메서드 영역


붕어빵과 붕어빵틀에 비유

자바의 메모리 구조는 크게 스택 영역, 메서드 영역, 힙 영역 3개로 나눌 수 있다.

  • 메서드 영역
    • 클래스 정보를 보관하는 영역. 이때, 클래스 정보 == 붕어빵 틀
  • 스택 영역
    • 실제 프로그램이 실행되는 영역
    • 메서드를 실행할 때마다 하나씩 쌓인다.
  • 힙 영역
    • 객체(인스턴스)가 생성되는 영역
    • new 명령어를 사용하면 이 영역이 이용됨
    • 붕어빵 틀로부터 생성된 붕어빵이 존재하는 공간!
    • 배열도 이 영역에 생성됨

 

메서드 영역

  • 프로그램을 실행하는데 필요한 공통 데이터를 관리
    • 클래스 정보, static 영역, 상수 풀이 있음
  • 프로그램의 모든 영역에서 메서드 영역이 공유된다.클래스 정보
  • 모든 실행 코드가 존재 (클래스의 실행 코드(byte 코드), 필드, 메서드와 생성자 코드 등)static 영역
  • static 변수들을 보관상수 풀
  • 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관
    • ex) 프로그램에 "hello"라는 리터럴 문자가 있으면, 이런 문자들을 공통으로 묶어서 관리
  • 프로그램을 효율적으로 관리하기 위한 상수들을 관리

메서드 코드

  • 자바에서 특정 클래스로 100개의 인스턴스를 생성하면, 힙 메모리에 100개의 인스턴스가 생김.
  • 각각의 인스턴스는 내부에 변수 & 메서드를 가짐.
  • 같은 클래스로부터 생성된 객체더라도 인스턴스 내부의 변수 값은 서로 다를 수 있다. 그래도, 메서드는 공통된 코드를 공유한다.

    -> 객체가 생성될 때, 인스턴스 변수에는 메모리가 할당되지만, 메서드에 대한 새로운 메모리 할당은 없다.

    => 인스턴스의 메서드를 호출하면, 실제로는 메서드 영역에 있는 코드를 불러서 수행하는 것!

 

스택 영역

    • 자바를 실행하면, 하나의 실행 스택 이 생성된다.
    • 스택 프레임지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.
      • 스택 프레임
        • 스택 영역에 쌓이는 하나의 네모 박스
        • 메서드를 호출할 때마다 하나의 스택 프레임이 쌓인다.
        • 메서드가 종료되면 해당 스택 프레임이 제거된다.
          • 더 정확히는, 스택 영역은 각 스레드별로 하나의 실행 스택이 생성된다.
            따라서, 스레드 수 만큼 스택 영역이 생성된다.

스택영역과 자바 코드

package memory;
public class JavaMemoryMain1 {
    public static void main(String[] args) {
        System.out.println("main start");
        method1(10);
        System.out.println("main end");
    }
    static void method1(int m1) {
        System.out.println("method1 start");
        int cal = m1 * 2;
        method2(cal);
        System.out.println("method1 end");
    }
    static void method2(int m2) {
        System.out.println("method2 start");
        System.out.println("method2 end");
    }
}
main start
method1 start
method2 start
method2 end
method1 end
main end

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

 

힙 영역

  • 객체와 배열이 생성되는 영역
  • 가비지 컬렉션(GC)이 이루어지는 주요 영역
  • 더이상 참조되지 않는 객체는 GC에 의해 제거됨

Garbage Collection(GC)

  • 자바의 메모리 관리 방법 중의 하나
  • JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중에서, 필요 없게 된 메모리 객체(garbage)를 모아서 주기적으로 제거하는 프로세스

💡 PC Register
스레드가 생성될 때마다 생기는 공간. 스레드가 실행하게 될 명령에 대한 부분을 기록한다.

💡 Native Method Stack
자바 프로그래밍 언어 이외의 언어로 작성된 메서드(Native Method)를 지원하기 위한 스택

 

스택 영역과 힙 영역이 같이 쓰일 때


Data

package memory;
public class Data {
    private int value;

    public Data(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

 

JavaMemoryMain2

package memory;
public class JavaMemoryMain2 {

    public static void main(String[] args) {
        System.out.println("main start");
        method1();
        System.out.println("main end");
    }

    static void method1() {
        System.out.println("method1 start");
        Data data1 = new Data(10);
        method2(data1);
        System.out.println("method1 end");
    }

    static void method2(Data data2) {
        System.out.println("method2 start");
        System.out.println("data.value=" + data2.getValue());
        System.out.println("method2 end");
    }

}
// method1() 에서 Data 클래스의 인스턴스를 생성한다.
// method1() 에서 method2() 를 호출할 때 매개변수에 Data 인스턴스의 참조값을 전달한다
main start
method1 start
method2 start
data.value=10
method2 end
method1 end
main end

 

1. main() 실행

 

2. method1() 실행

 

3. method2() 실행

 

4. method2() 종료

 

5. method1() 종료

 

6. method1() 종료 직후