모든 스레드가 공유하는 메모리 공간
으로, 로드된 클래스와 인터페이스의 메타데이터와 런타임 상수풀(Runtime Constant Pool), 정적 멤버(static)등이 저장된다.Reflection API
사용해 Method 영역에 있는 클래스 정보에 접근할 수 있다.💡 Reflection
- 구체적인 클래스 타입을 알지 못해도 클래스의 생성자, 메서드, 변수 등에 접근할 수 있도록 도와주는 Java 기본 API
💡 Runtime Constant Pool
- 리터럴 상수뿐만 아니라 클래스와 인터페이스명, 메서드 및 필드명 등을 저장하고, 상수에 대한 참조를 나타낸다.
즉, 프로그램이 실행되는 동안 변하지 않는 값들이 저장된다.- 인덱스 1부터 시작해 상수에 대한 참조를 나타낸다.
public class Example {
public static void main(String []args) {
System.out.println("Hello, world");
}
}
#n
은 상수 풀에 대한 참조를 나타낸다.ldc
는 load constant
의 약자로,모든 스레드가 공유하는 메모리 공간
으로 객체를 생성할 때마다 메모리 공간이 할당된다.
따라서, dead code(실행되지 않는 코드)라면 힙 영역에 할당되지 않는다.
참조 타입(Reference type)
이 Heap 영역에 저장되는 이유는 객체가 동적으로 생성되고 내부 참조 크기가 동적으로 변하기 때문이다.
구분 | 32-bit JVM | 64-bit JVM |
---|---|---|
내부 참조 크기1 | 4 bytes | 8 bytes |
최대 메모리 공간2 |
Java.lang.OutOfMemoryError : java heap space
에러가 발생한다.Heap 메모리 공간의 크기가 작거나
애플리케이션 로직 문제
로 발생하는 경우가 있다.-Xms
(초기 힙 크기), -Xmx
(최대 힙 크기) 옵션을 사용해 제어 가능하다.💡 idea64.exe.vmoptions
- IntelliJ IDEA 실행 시 JVM 옵션을 주는 파일
메서드 호출 정보를 저장하는 공간
으로 각 스레드(Thread)별로 생성된다.Frame
)이 호출 스택(Call Stack)3에 추가(Push
)되고, 메서드가 종료되면 해당 프레임이 스택에서 제거(Pop
) 된다.Java.lang.StackOverFlowError
에러가 발생한다.재귀함수
를 사용하거나 상호 참조(본인참조 포함)
문제로 발생하는 경우가 있다.💡 Thread
- 프로세스(
process: 실행 중인 프로그램
) 내에서 실제로 작업을 수행하는 주체이자 실행 단위
💡 Frame
- 메서드 호출에 대한 정보를 저장 (매개변수 및 지역변수, 리턴 값 등)
스레드의 현재 수행 중인 명령어의 주소를 저장하는 공간
으로, 각 스레드(Thread)별로 생성된다.💡 JNI(Java Native Interface)
- JVM 위에서 실행되고 있는
자바코드
가다른 언어들(C, C++ 등)로 작성된 라이브러리
들을호출
하거나 반대로호출되는 것을 가능하게
하는 프로그래밍 프레임워크
💡참고