※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요!
JVM의 메모리 구조를 살펴보기 전에 자바 프로그램의 실행 단계부터 간략히 알아보자.
(1) 자바 컴파일러에 의해 자바 소스 파일(.java)이 바이트 코드(.class)로 변환된다.
(2) JVM은 바이트 코드(.class)를 읽어 해당 프로그램을 실행한다.
(3) 프로그램이 실행되면, JVM은 시스템으로부터 프로그램 수행에 필요한 메모리를 할당받는다.
(4) JVM은 할당받은 메모리를 용도에 따라 여러 영역으로 나누어 관리하는데, 3가지 주요 영역으로 Method Area, Call stack, heap이 있다.
[ 1 ] Method Area
프로그램 실행 중 어떤 클래스가 호출되면(사용되면), JVM은 .class 파일을 읽어 클래스(인터페이스 포함)의 메타 데이터를 이곳에 저장한다. 클래스의 메타 데이터로는 Type Information, Runtime Constant pool, Field Information, Method Information이 있다.
- Type Information (클래스와 인터페이스를 통칭)
- Type의 전체 이름 (패키지명 + 클래스명)
- Type의 직계 하위 클래스 전체 이름
- Type이 클래스인지, 인터페이스인지
- Type의 접근제어자(public, abstract)
- Runtime Constant Pool
- Type의 모든 상수 정보
- Type, Field, Method로의 모든 Symbolic Reference 정보 포함
- Field Information (인스턴스 변수의 정보)
- Field의 Type
- Field의 접근제어자
- Method Information
- 생성자를 포함한 모든 메소드의 정보
- name, return type, parameter수와 type, 접근제어자, method의 byte code 등
※ 클래스의 메타 데이터뿐만 아니라, 해당 클래스의 클래스 변수(static)도 해당 영역에 함께 생성된다.
[ 2 ] heap
인스턴스가 생성되는 공간이다. 프로그램 실행 중 생성되는 인스턴스는 모두 heap 영역에 생성되며, 인스턴스 변수도 해당 영역에 생성된다.
또한, heap 영역은 Garbage Collection의 대상이 되는 영역으로, 참조되지 않는 메모리는 Garbage Collector에 의해 제거된다.
[ 3 ] Call stack (호출스택)
stack은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면 stack에 메모리가 할당되며, 해당 메모리는 메서드가 작업을 수행하는 동안 지역변수, 매개변수, 연산의 중간결과 등을 저장하는 데 사용된다. 메서드가 작업을 마치면 할당되었던 메모리는 반환되어 비워진다.
[ stack의 특징 ]
- 메서드가 호출되면 수행에 필요한 만큼의 메모리를 stack에 할당받는다.
- 메서드가 수행을 마치면 사용했던 메모리를 반환하고 stack에서 제거된다.
- 첫 번째 메서드 수행 중에 다른 메서드를 호출하면, 첫 번째 메서드 바로 위에 두 번째로 호출된 메서드를 위한 공간이 마련된다.
public class CallStack {
public static void main(String[] args) {
secondMethod();
}
static void secondMethod() {
System.out.println("second");
}
}
- 즉, 위 코드를 실행하면 우선 stack의 가장 아래에 main 메서드를 위한 공간이 마련된다.
- main 메서드는 수행 중 secondMethod()를 호출한다. 따라서 main 메서드 바로 위에 secondMethod 를 위한 공간이 마련된다. 이때 main 메서드는 수행을 멈추고 secondMethod가 수행되기 시작한다.
- secondMethod가 수행을 마치면 stack에서 제거되고, main 메서드로 돌아간다.
- main 메서드에서도 더 이상 수행할 코드가 없으므로 stack은 완전히 비워지게 된다.
- 즉, stack의 가장 위에 있는 메서드가 현재 실행 중인 메서드이다.
- 아래에 있는 메서드는 바로 위의 메서드를 호출한 메서드이다.
[참고자료]
남궁성. Java의 정석
https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/
JVM의 Runtime Data Area · 안녕 프로그래밍
자바는 운영체제 독립적으로 JVM 환경에서 동작할 수 있도록 설계가 되어 있는 동적 언어 이다. 자바 프로그램이 시작되고 종료 될 때까지 자바의 소스코드가 어떠한 형태로 JVM의 메모리에 할당
www.holaxprogramming.com
https://steady-coding.tistory.com/305
JVM 메모리 구조란? (JAVA)
안녕하세요? 코딩 중독입니다. 오늘은 JVM 메모리 구조에 대해 알아보겠습니다. JVM이란? JVM 메모리 구조를 설명하기 전에 JVM이 무엇인지 알아야 합니다. JVM은 Java Virtual Machine의 약자로, 자바 가상
steady-coding.tistory.com
'Programming > Java' 카테고리의 다른 글
[Java] Set Interface - HashSet (1) | 2023.03.06 |
---|---|
[Java] 스택(Stack)과, 큐(Queue) (3) | 2023.02.28 |
[Java] 클래스, 객체, 인스턴스의 차이 및 객체 배열 (0) | 2023.02.17 |
[Java] JVM, Java 환경변수 설정(Mac, 기본 zsh 쉘) (5) | 2023.01.18 |
[Java] List Interface (0) | 2022.10.10 |