JVM이란?
JVM [Java Virtual Machine] 자바 가상 머신
- 자바와 운영체제 사이에서 중개자 역할을 수행
- 자바가 운영체제에 구애 받지 않고 프로그램을 실행
- 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행
- 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작
자바 프로그램의 실행 단계
자바소스파일 (.java) > 컴파일러 (javac) > 바이트코드파일 (.class) > 자바가상기계 (java) > 기계어 > 실행
바이트 코드(.class)를 JVM에서 읽어 들인 다음,
이것저것 복잡한 과정을 거쳐서 어떤 운영체제든간에 프로그램을 실행할 수 있도록 만드는 것
만약, 자바 소스 파일은 리눅스에서 만들었고 윈도우에서 이 파일을 실행하고 싶다면, 윈도우용 JVM을 설치만 하면 된다.
여기서 JVM은 운영체제에 종속적이라는 특징을 알 수 있다
JVM 메모리 구조
JVM이 정확히 어떻게 동작을 하고 구조가 어떤지 알아 봅시다.
JVM의 구조: Garbage Collector / Execution Engine / Class Loader / Runtime Data Area 로, 4가지로 나눌 수 있다.
자바 프로그램의 자세한 실행 단계
(1) Class Loader
JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈입니다.
런타임 시에 동적으로 클래스를 로드합니다.
(2) Execution Engine
클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행합니다.
(3) Garbage Collector
Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할.
(4) Runtime Data Area [method / heap / stack / pc register / native metode stack]
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다.
이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있습니다.
*런타임 = 프로그램이 시작될때
1. Method area
모든 쓰레드가 공유하는 메모리 영역입니다.
메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 분석 후 저장합니다.
static 영역 (== class, method 영역으로도 불림) 은 전역변수나 static으로 선언되는 것들을 메모리에 상주시킵니다.
- 클래스 정보, static 변수, 변수 정보, 메소드 정보 등을 저장합니다.
- 패키지나 클래스 정보가 올라갑니다.
- static 이 선언된 클래스 멤버도 올라갑니다.
- static (전역)변수는 어디든 접근이 가능해지므로 읽기 전용이 아닌 경우는 가능한 사용하지 않습니다.
- JVM이 동작해서 클래스가 로딩될 때 생성됩니다.
- JVM이 종료될때까지 유지됩니다.
2. Heap area
모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역입니다.
또한, 메소드 영역에 로드된 클래스만 생성이 가능하고
Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역입니다.
힙 영역은 인스턴스를 생성할 때 생성되는 메모리 형식입니다.
Instance instance = new Instance(); -> heap에 존재
- "new"를 사용하여 객체를 만들 때 저장됩니다.
- 참조형(class, interface, enum, Array 등) 자료형도 같이 저장됩니다.
- 힙의 참조 주소는 "스택"이 갖고 있고 해당 객체를 통해서만 힙 영역에 있는 인스턴스를 핸들링할 수 있습니다.
- GC가 정리하기 전까지는 남아있습니다.
3. Stack area
메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성합니다.
그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및
연산 시 일어나는 값들을 임시로 저장합니다. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제합니다.
Stack 구조는 Last In First Out 후입선출 즉 나중에 들어간게 먼저 나오는 구조를 가졌다.
스택 영역은 int, long, boolean 등 기본 자료형을 생성할 때 저장하는 공간으로,
임시적으로 사용되는 변수나 정보들이 저장되는 영역입니다.
- 쓰레드 별로 1개만 생성됩니다.
- 하나의 쓰레드는 내부적으로 static, stack, heap 영역을 갖게 됩니다.
- → 그래서 A쓰레드는 다른 쓰레드에 접근할 수는 없지만, static과 heap 영역을 공유하여 사용할 수 있습니다.
- 메소드가 호출될 때마다 생성하고,
- 메서드 실행이 끝나면 pop되어 제거됩니다.
4. PC Register
쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재합니다.
쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로
현재 수행중인 JVM 명령의 주소를 갖습니다.
5. Native method stack
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다.
아래는 참고 링크들이다.
https://steady-coding.tistory.com/305
https://yaboong.github.io/java/2018/05/26/java-memory-management/
JVM 동작원리 설명 링크
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] 2022-06-16 기본 · 참조 타입 ☑ (0) | 2022.06.16 |
---|---|
[JAVA] 22-06-15 자바 static ☑ (0) | 2022.06.15 |
[JAVA] 객체 지향 OOP ! 개념 이해 추가 정리 ☑ (0) | 2022.06.14 |
[JAVA] 자바 객체와 클래스 ! 개념 이해 추가 정리 ☑ (0) | 2022.06.13 |
[JAVA] 22-06-13 자바의 시작과 Scanner ☑ (0) | 2022.06.13 |