JVM (Java Virtual Machine) 이란?
- JVM은 Java Virtural Machine의 약자로, 자바 가상 머신이라고 부릅니다.
- JAVA와 운영체제 사이에서 중계자 역할을 합니다. -> JAVA가 운영체제 종류에 영향받지 않고 돌아 갈 수 있는 이유
- 메모리 관리를 자동으로 해줍니다(GC : Garbage Collection)
여기서 핵심은 JVM이 운영체제와 플랫폼 종류에 의존적이지 않고 독립적으로 JAVA 프로그램이 실행 된다는 것(WORA) 입니다.
WORA : Write Once, Run Anywhere -> 한 번 작성한 코드는 어디서든 실행 할 수 있는 자바의 대표적인 장점

JVM 메모리 구조

자바 소스 파일은 자바 컴파일러에 의해서 바이트 코드 형태인 클래스 파일이 됩니다. 그리고 이 클래스 파일은 클래스 로더가 읽어드리면서 JVM이 수행됩니다.
Class Loader
JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈입니다. 런타임 시에 동적으로 클래스를 로드합니다.
Execution Engine
클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행합니다.
최초 JVM이 나왔을 당시에는 인터프리터 방식이었기 때문에 속도가 느리다는 단점이 있었지만 JIT(Just In Time) 컴파일러 방식을 통해 이 점을 보완하였습니다. JIT는 바이트 코드를 어셈블러 같은 네이티브 코드르 바꿈으로써 실행이 빠르지만 역시 변환하는데 비용이 발생하였습니다. 이와 같은 이유로 JVM의 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준을 넘어가면 JIT 방식으로 실행합니다.
Garbage Collector
Garbage Collector (GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 합니다.
이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없습니다.
GC에 대한 자세한 내용은 아래의 글에서 확인 가능합니다:-)
https://dev-ahkong.tistory.com/15
[Java] Garbage Collection(가비지 컬렉션) 톺아보기
1. Garbage Collection(가비지 컬렉션)이란? 프로그램을 개발 하다 보면 유효하지 않은 메모리 인 가비지(Garbage)가 발생하게 됩니다. C언어를 이용하면 free()라는 메서드를 통해 메모리 해제를 해주어야
dev-ahkong.tistory.com
Runtime Data Area
JVM의 메모리 영역으로 자바 어플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다. 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 나눌 수 있습니다.
1) Method Area
모든 쓰레드가 공유하는 메모리 영역입니다. 메소드 영역은 클래스,인터페이스,메소드,필드, Static 변수 등의 바이트 코드를 보관 합니다.
2) Heap Area
모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역입니다. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역입니다.
3) Stack Area
메서드 호출 시마다 각각의 스택 프레임(해당 메서드만을 위한 공간)을 생성합니다. 그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수,지역변수,리턴 값 및 연산 시 일어나는 것들을 임시로 저장합니다. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제합니다.
4) PC Register
쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재합니다. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야 할지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖습니다.
5) Native method stack
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역 입니다.
+ 찾아보기
JNI의 단점 중 하나가 메모리 누수가 발생 할 수 있는 것인데 Heap 영역에 한에서 가비지 컬렉터가 동작하고 JNI로 사용하는 것들은 Native method stack에 저장이 되니까 메모리 누수가 발생 할 수 있는건가?
참고 🙇🏻
https://steady-coding.tistory.com/305
What To Study Next ✅
1) JIT 동작 방식
2) + 찾아보기에 대한 답변 알아오기
#java #jvm #메모리구조
'Dev > Java' 카테고리의 다른 글
| Java Streams (2) - 가공하기 ⚒ (0) | 2022.12.29 |
|---|---|
| Java Streams (1) - 스트림 생성하기 👀 (0) | 2022.12.27 |
| [Java] Default Method in Java8 (0) | 2022.11.07 |
| [Java] Garbage Collection(가비지 컬렉션) 톺아보기 (1) | 2022.10.02 |
| [JAVA] 메모리 누수(Memory Leak) (0) | 2022.09.18 |