JVM 이란?
자바 가상 머신(Java Virtual Machine, JVM)은 시스템 메모리를 관리하면서 자바 기반 애플리케이션을 위해 이식 가능한 실행 환경을 제공한다. JVM은 다른 프로그램을 실행시키는 것이 목적인 프로그램이다. 방어적 코딩(Coding Kung Fu)의 가장 훌륭한 예 가운데 하나이기도 한 간단한 아이디어이기도 하다. JVM은 당시에도 상황을 뒤집어 놓았고 지금까지도 프로그래밍 혁신을 지원하고 있다.
JAVA program 실행 과정
- 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받습니다.
(JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리함 )- 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트 코드(.class)로 변환시킵니다.
- Class Loader를 통해 class파일들을 JVM으로 로딩합니다.
- 로딩된 class파일들은 Execution engine을 통해 해석됩니다.
- 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실직적인 수행이 이루어지게 됩니다. 이러한 실행과정 속에서 JVM은 필요에 따라 Thread Synchronization과 가비지컬렉터(GC) 같은 관리작업을 수행합니다.
JVM의 작동 방식
먼저 Java 코드가 바이트 코드로 컴파일됩니다. 이 바이트 코드는 다른 컴퓨터에서 해석됩니다. 호스트 시스템과 Java 소스 사이에서 Bytecode는 중간 언어입니다. Java의 JVM은 메모리 공간 할당을 담당합니다.
1. 클래스 로더(Class Loader)
자바 프로그램의 확장자는 '.java'이며 이 파일이 자바 컴파일러에서 컴파일 과정을 거치면서 '.class' 파일이 생성됩니다.
즉 자바 소스가 JVM에 적재가 가능하도록 바이트 코드로 변환이 됩니다.
그러면 1번인 Class Loader가 클래스 로딩을 통해 Class 파일들을 JVM에 적재해 JVM은 클래스 파일을 읽고, 메모리를 할당해줍니다.
2. 메소드 영역(Method Area)
적재된 클래스 파일들은 2번 Method Area(메소드 영역)에 저장됩니다. 클래스 파일은 메소드와 클래스 변수로 구성되어 있고 메타정보라고 합니다.
JVM에서 클래스를 실행하면 메소드 영역에서 클래스 정보를 복사하고 힙 영역에서 메모리를 할당하여 실행합니다.
메소드 영역은 JVM 메모리 영역 중 가장 먼저 데이터가 저장 되는 곳!
3. 힙 영역(Heap Area)
메소드 영역에서 클래스 정보를 복사하면 이제 2번 Heap Area(힙 영역)에 메모리를 할당한다고 했습니다.
JVM의 영역 중에서 가장 중요한 역할을 담당 하는데요!
그 유명한 GC(Garbage Collection, 가비지 컬렉션)을 수행하는 영역입니다.
실행된 클래스를 객체라고 했을 때 이 객체가 힙 영역에 저장이 됩니다.
즉 힙 영역은 동적 데이터가 생성되고 소멸되는 영역이라 할 수 있겠습니다.
여기서 좀 더 깊게 들어가면 힙 영역에는 크게 3가지 영역이 더 있는데요.
Young Generation, Old Area, Permanent Area 가 있습니다. 그냥 참고 하시면 좋을 것 같습니다.
Young 영역은 다시 Eden, Servivor1, Servivor2 로 나눌 수 있어요.
Young 영역은 프로그램 내부에 새롭게 생긴 데이터가 저장되는 부분이고, 이 데이터가 계속해서 사용되면
Old 영역으로 가게됩니다. 즉 데이터의 목적과 수명에 따라 저장영역이 다릅니다.
Permanent 영역은 클래스의 정보를 저장하는 영역입니다.
3-1 가비지 컬렉터 (Garbage Collector)
가비지 컬렉터는 힙 영역에서 참조되지 않은 데이터를 삭제하는 역할을 합니다.
그로 인해 개발자들의 불편을 많이 덜어줍니다.
가비지 컬렉터가 데이터를 삭제하는 알고리즘은 힙의 영역에 따라 다른데요.
Young 영역은 새로운 데이터가 생성, 소멸되는 것이니 삭제의 속도가 주기가 빠른 편입니다.
그에 반에 Old 영역은 계속하여 사용하는 데이터다 보니 삭제의 속도 및 주기가 Young영역보다 비교적 느린편입니다.
4.Stack Area
스택 영역은 호출된 메소드가 저장되는 영역입니다. 클래스의 실행은 메소드 호출을 의미하고,
메소드는 다른 메소드를 호출할 수 있습니다. 실행이 끝나면 저장된 메소드는 삭제됩니다.
데이터의 예로는 메소드가 실행 될 때마다 저장되는 매개변수, 지역변수, 복귀주소 등이 있습니다.
5. PC Register Area
레지스터 영역은 현재 JVM이 수행할 명령어의 주소를 저장하는 메모리 공간이며, 개발자가 크게 건들 일이 없다.
6. Native Method Stack Area (네이티브 메소드 스택 영역)
네이티브 메소드는 OS의 시스템 정보, 리소스를 사용하거나 접근하기 위한 코드로 주로 C, C++로 작성합니다.
자바 프로그램은 OS위에 JVM이 있기 때문에 OS 시스템에 직접 접근하기 어렵지만, JNI(Java Native Interface) API를 사용하면
OS시스템의 접근이 가능하다. 이 때 사용 되는 네이티브 메소드들이 대한 정보가 네이티브 메소드 스택 영역에 저장된다.
참고
www.guru99.com/java-virtual-machine-jvm.html
'Language > Java' 카테고리의 다른 글
Java 컬렉션(Collection) (0) | 2021.04.22 |
---|---|
Java 자료형 (0) | 2021.04.22 |
POJO, DAO, DTO, VO 차이 (0) | 2021.04.22 |
메모리 누수 (Memory leak) (0) | 2021.04.20 |
1. BinaryGap : Find longest sequence of zeros in binary representation of an integer. (0) | 2021.04.16 |