자바 가상 머신(JVM, Java Virtual Machine)
15 Apr 2021들어가기 전에
Java 이전에 나왔던 언어인 C/C++의 경우 메모리 누수를 방지하기 위해 사용하지 않은 객체는 개발자가 직접 해제를 해주어야 했다. 하지만 Java에서는 JVM이 대신 이 작업을 해준다. JVM은 시스템 메로리를 관리하면서 자바 기반 애플리케이션을 어디서든 실행할 수 있는 실행 환경을 제공한다.
JVM(Java Virtural Machine)
JVM은 어느 운영체제에서나 자바 프로그램이 실행될 수 있도록 해주고 프로그램의 메모리를 개발자 대신 관리해주는 아주 유용한 친구이다. 자바 애플리케이션을 클래스 로더를 통해 읽어들이고, 자바의 API와 함께 실행되며 자바와 OS 사이의 중개자 역할을 수행하여 OS에 구애받지 않고 재사용을 가능하게 해준다.
자바 프로그램의 실행 과정
- 프로그램이 실행될 때 JVM이 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받는다. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
- 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어 자바 바이트코드(.class)로 변환시킨다.
- 클래스 로더(Class Loader)를 통해 .class 파일들을 JVM으로 로딩한다.
- 로딩된 .class 파일들은 Excution engine을 통해 해석된다.
- 해석된 바이트 코드들이 메모리 영역에 배치되어 작업이 이루어진다.
이때, 필요에 따라 스레드 동기화나 가비지 컬렉션과 같은 메모리 관리 작업을 JVM이 수행한다.
JVM 구성
클래스 로더(Class Loader)
JVM내로 클래스 파일(.class)을 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈. 클래스를 처음 참조할 때 해당 클래스를 로드하고 링크하는 모든 작업을 진행한다.
Runtime Data Areas
프로그램 수행을 위해 OS에서 할당받은 공간으로 크게 5가지 영역으로 구분된다.
-
- PC 레지스터
- 스레드가 어떤 명령어로 실행되어야 할지 기록하는 부분으로 JVM 명령의 주소를 갖는다.
-
- JVM stack 영역
- 임시로 할당되었다가 소멸되는 특성의 데이터를 저장하기 위한 영역으로 지역변수, 매개변수, 메소드 정보, 임시 데이터 등을 자정한다.
-
- Native method stack
- 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다.
-
- Heap
- 객체를 저장하는 가상 메모리 공간으로 new를 통한 객체생성이나 배열등이 여기에 저장된다. 힙에 할당된 데이터들은 가비지컬렉터의 대상이 된다. 이 공간이 JVM 성능 이슈에서 가장 많이 언급되는 공간이다.
-
- Method Area
- Class area 또는 Static area 라고도 부르며 클래스 정보를 처음 메모리에 올릴 때 초기화되는 대상을 저장하기 위한 공간으로 JVM이 시작될 때 생성된다. 정적 변수, 메소드 바이트 코드 등을 보관한다.