[Java] 7. JAVA 메모리(Stack, Heap)
Stack
메모리와 Heap
메모리 설명 포스팅이다. Runtime Data Area 설명 이후 하단에 정리되어 있다.
1. Runtime Data Area
Runtime Data Areas
는 JVM 이 Java Bytecode 를 실행하기 위해 사용되는 메모리 공간
1.1. 메소드(Method) 영역
- Method 영역은 JVM이 시작 될 때 생성되는 공간(바이트코드가 해당 영역에 저장)
- 클래스 로더가 클래스 파일을 읽어오면서 클래스 정보를 파싱해서 Method Area에 저장
- 클래스, 메서드, 정적변수, static 변수들이 저장되고
모든 스레드가 공유하는 영역
1.2. 힙(Heap) 영역
- JVM을 시작할 때 생성되는 공간
- 사용되지 않는 객체는 GC가 삭제
Reference Type(참조타입)
의 참조변수(객체/배열)들이 저장- 동적으로 생성 된
인스턴스 객체
가 저장되는 공간(new 객체 생성 연산자로 생성된 인스턴스 객체) - 클래스의 객체, 변수 등 모든 스레드가 공유하는 영역
1.3. 스택(Stack) 영역
- 메서드 호출 시 생성(스레드별로 생성)
- 메서드를 호출/종료 할 때 마다 push/pop
Primitive Type(원시타입)
의 변수들이 저장- new 생성자를 통한
객체 변수
가 저장되는 공간 - 지역변수나 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역
1.4. PC Register
- 스레드가 시작될 때 생성되며, 스레드의 명령어를 저장하는 공간이다. 즉, 현재 수행중인 JVM의 명령어 주소를 저장하는 공간이다.
1.5. Navtive Method Stack
- JAVA가 아닌 다른 언어로 작성 된 코드를 위한 공간(C, C++)
2. Stack
vs Heap
메모리 비교
Stack | Heap |
---|---|
Primitive Type(원시타입) 의 변수들이 저장 | Reference Type(참조타입) 의 참조변수 (객체/배열)들이 저장 |
new 생성자를 통한 객체 변수 가 저장되는 공간 | 동적으로 생성 된 인스턴스 객체 가 저장되는 공간 |
메서드를 호출/종료 할 때 마다 push/pop | 사용되지 않는 객체는 GC가 삭제 |
샘플코드
Heap 영역에 저장 된 객체의 데이터 메모리 주소값을 name 참조변수에 할당해 Stack 메모리에 저장.
Reference Type 변수(객체/배열)들이 Stack에 저장되면 push/pop 발생으로 비효율적이기에 Stack 영역이 아닌 Heap 영역
에 저장된다. Heap 영역에 메모리를 저장하고, 그 메모리를 참조하는 주소를 Stack 메모리에 저장하는 것이다.