= 힙 영역(Heap Area)
: JVM이 시작될 때 생성되어 애플리케이션이 동작하는 동안(=런타임) 동적으로 할당하여 사용되는 메모리 영역.
- 힙 영역에 생성된 인스턴스와 배열은, 스택 영역의 변수나 다른 객체의 필드에서 참조한다
- new 연산자로 생성된 객체(인스턴스)와 배열을 저장
- 힙 영역의 사용기간 : 참조하는 변수나 필드가 없다면, 의미 없는 객체가 되어 GC의 대상이 되어버린다. GC는 이 Heap영역에서 발생한다.
- 힙 영역은 모든 스레드에서 공유한다.
그 이유는, 스레드는 메모리 구조에서 스택(Stack)영역을 분할하여 메모리를 사용하기 때문이다. 스레드는 각각의 스택영역을 가지지만, 힙(Heap) 영역은 하나로 공유해서 사용하기 때문이다. 따라서 멀티 프로세스(여러개의 프로세스)대비 메모리를 적개 사용할 수 있는 구조가 된다.
= 스택 영역(Stack Area)
: 기본 자료형(int, double, byte, long, boolean 등)에 해당되는 지역변수(매개 변수 및 블럭문 내 변수 포함), 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역.
- 스레드별로 하나씩 생성된다.
- 메소드가 호출될 때 프레임을 추가(push)하고, 종료되면 프레임 제거(pop)
- Stack 영역은 LIFO(Last IN First Out)의 구조를 가지기때문에, 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다.
- 콜 스택(call stack) : 현재 실행중인 서브루틴에 대한 정보들을 담아두는 스택구조의 메모리 영역.
(!) 서브루틴(Sub Routine)이란? 반복되는 기능에 대해서 하나의 func을 메모리에 적재한 뒤, 필요시 그 메모리주소를 호출하여 기능을 실행하는 방법. 메모리의 사용량을 줄일 수 있다.
= 메소드 영역(Method Area)
: JVM이 읽어들인 Class와 interface에 대한 런타임 상수풀, 멤버 변수(필드), 클래스 변수(static), 생성자와 메소드 정보(메타데이터)를 저장하는 공간.
- Class, Code, Static 영역 등으로도 알려져 있다.
- 메소드 영역은 모든 스레드에서 공유한다.
- static이 붙은 자료형, 전역변수를 프로그램이 시작해서 종료될 때까지 메모리에 남아있다.
- Method Area내에는 Runtime Constant Pool 영역을 가지고 있고, 이 안에는 Class/interface의 메소드, 필드, 문자열 상수등의 레퍼런스가 저장되며, 이들의 물리적인 메모리 위치를 참조할 경우에 사용한다.
= PC Registers
: 현재 수행중인 JVM 명령 주소값이 저장된다. Thread가 생성될 때 마다 생기는 공간으로 Thread가 어떠한 명령을 실행하게 될지에 대한 부분이 기록된다.
- JVM은 Stack에서 Operand(피연산자 - 컴퓨터 처리의 대상)를 뽑아내 별도의 메모리 공간에 저장하는 방식을 사용하는데, 이 공간이 PC Registers가 된다.
= Native Method Area
: 자바 외 언어(C/C++)로 작성된 네이티브 코드를 위한 메모리 영역.
- JNI(Java Native Interface)를 통해 호출하는 C/C++ 등의 코드를 수행하기 위한 스택으로, C나 C++ 스택이 생성됨
'JAVA' 카테고리의 다른 글
Java - Enum (0) | 2021.09.15 |
---|---|
Java - 로컬환경 자바프로젝트 세팅 (with Docker) (0) | 2021.09.15 |
Java - 자바 객체 지향의 원리와 이해(개념정리) - 2편 (0) | 2021.02.24 |
Java - 자바 객체 지향의 원리와 이해(개념정리) - 1편 (0) | 2021.02.08 |
Java - lambda와 Stream (0) | 2021.02.04 |