본문 바로가기
  • 시 쓰는 개발자
1일 1개념정리 (24년 8월~)/Java

1일1개 (38) - Java 메모리 구조

by poetDeveloper 2024. 9. 20.
반응형

1일 1개념정리 24.08.09.금 ~ 

 

큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.

무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!


#38. Java 메모리 구조

Java의 메모리 구조를 보다보면, 힙구조, 스택구조 등이 나온다. 그리고 객체는 또 어디에 저장되고 .... 내가 아는 것을 램 밖에 없는데 .... 이참에 Java 메모리 구조에 대해 알아보자. 다음 내용도 참고하자.

https://100won-developer.tistory.com/entry/1%EC%9D%BC1%EA%B0%9C-4-JVM

 

1일1개 (4) - JVM

1일 1개념정리 24.08.09.금 ~  큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!#4. JVMJava를 공부

100won-developer.tistory.com

 

 

Java 메모리 구조

크게 3가지로 나누기도 한다. 메소드 영역, 힙, 스택으로 이야기하기도 하는데 여기선 PC 레지스터와 네이티브까지 5가지로 이야기한다.

 

1. 메소드 영역 (Method Area) : JVM이 시작될 때 클래스 메타데이터(클래스 이름, 메소드, 필드, 인터페이스 등)를 저장. 모든 쓰레드가 공유하는 영역이다. 그리고 이름처럼 클래스가 로드될 때 이 영역에 메모리를 할당한다.

  • 클래스의 구조 정보 (클래스 변수, 메소드 정보)
  • 정적 변수 (static)
  • 런타임 상수 풀 (문자열 리터럴, 상수 값 등)

2. 힙 영역 (Heap Area) : 객체와 배열을 동적으로 생성하고 관리하는 공간이다. 가비지 컬렉션을 통해 메모리를 자동으로 관리한다. 모든 쓰레드가 이 영역을 공유한다.

  • 모든 객체(instance)와 배열을 저장

3. 스택 영역 (Stack Area) : 메소드 호출 시 지역 변수와 매개변수를 저장한다. 각 쓰레드마다 "독립적인" 스택 영역을 가진다. 메소드 호출이 끝나면 스택 프레임이 제거된다. (메모리 할당과 해제가 빠름)

  • 메소드의 지역 변수
  • 매개변수
  • 메소드 호출 시의 반환 주소

4. PC 레지스터 (Program Counter Register) : 현재 실행 중인 명령어의 주소를 저장. 각 쓰레드마다 독립적으로 존재하며, 멀티 쓰레드에서 쓰레드간 실행 흐름을 관리한다.

  • 실행 중인 메소드의 다음 명령어 주소

5. 네이티브 메소드 스택 (Native Method Stack) : Java 말고 다른 언어로 작성된 네이티브 메소드를 호출할 때 사용하는 공간이다. 네이티브 메소드를 사용할 때만 존재하고, 그래서 다른 언어의 메모리 관리와 관련이 있다.

  • 네이티브 메소드 호출 시의 지역 변수 및 매개변수
public class MemoryExample {

    // 클래스 변수 (메소드 영역에 저장)
    static int staticVariable = 10; // 메소드 영역에 저장됨

    // 인스턴스 변수 (힙 영역에 저장)
    int instanceVariable;

    // 생성자: 객체 생성 시 호출됨
    public MemoryExample(int value) {
        this.instanceVariable = value; // 힙 영역에 저장된 객체의 인스턴스 변수에 값 할당
    }

    public void display() {
        // 지역 변수 (스택 영역에 저장)
        int localVariable = 5; // 스택 영역에 저장됨
        System.out.println("클래스 변수 : " + staticVariable); // 메소드 영역에서 읽음
        System.out.println("인스턴스 변수 : " + instanceVariable); // 힙 영역에서 읽음
        System.out.println("지역 변수 : " + localVariable); // 스택 영역에서 읽음
    }

    public static void main(String[] args) {
        // 객체 생성 (힙 영역에 저장)
        MemoryExample example = new MemoryExample(20); // 생성자 호출로 인해 새로운 객체가 힙 영역에 생성됨
        example.display(); // 메소드 호출 (스택 영역에 display() 메소드의 프레임이 생성됨)
    }
}
반응형