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
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() 메소드의 프레임이 생성됨)
}
}
'1일 1개념정리 (24년 8월~) > Java' 카테고리의 다른 글
1일1개 (37) - 참조타입, 기본타입 (0) | 2024.09.19 |
---|---|
1일1개 (25) - 생성자 (0) | 2024.09.04 |
1일1개 (21) - 불변객체란 ? (0) | 2024.08.30 |
1일1개 (20) - ==와 equals()의 차이 (0) | 2024.08.29 |
1일1개 (19) - static (0) | 2024.08.28 |