Back-end/CS knowledge

자바가상머신 JVM 이란?

cheersHena 2022. 7. 25. 06:27
반응형

JVM Java Virtual Machine 

 

자바가상머신은 자바 바이트코드인 .class 파일을 OS에 특화된 코드로 변환하여 실행한다. 

바이트코드파일은 운영체제에서 바로 실행할 수 없고, 자바가상머신이라는 번역기가 필요하다. 

자바가 JVM을 사용하는 이유는 바이트 코드 파일을 다양한 운영체제에서 수정없이 사용하기 위함이다.

 

이 특징이 자바를 플랫폼에 종속되지 않고 독립적으로 작동하게 하는 것이다. 

단, JVM 자체가 플랫폼에 독립적이지는 않다. 때문에 JVM은 윈도우용, 리눅스용 등 각 운영체제용 JVM이 존재하고 각 운영체제의 JVM이 바이트코드파일은 해당 운영체제에서 실행가능한 기계어로 번역하여 프로그램을 실행하는 것이다. 

 

프로그램이 시작되면 JVM은 OS로부터 프로그램을 수행하는데 필요한 메모리를 할당받는다.

이 메모리를 가지고 JVM이 용도에 따라 구분해서 사용한다. 

 

 JVM 의  3가지 구성 요소 

1. Class Loader 클래스 로더 

클래서 로더는 1)로딩, 2)링크, 3)초기화 순서로 진행된다. 이름 그대로 클래스 파일을 적재하는 역할을 한다. 

hello.java 파일을 컴파일하면 hello.class 파일 즉, 바이트코드가 생성되고, 이런 파일들을 모아 클래스 로더가 메모리에 적재시킨다.

클래서 파일이 적재되는 장소는 Runtime Data Area 이다. 

1) 로딩

클래서 로더가 .class파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들어 메서드 영역에 저장한다. 

로딩이 끝나면 해당 클래스 타입의 class객테를 생성하여 힙 영역에 저장한다.

2) 링크(링킹) 

컴파일러의 결과물인 바이트코드를 최종 실행가능한 실행파일 (.exe)로 만들기 위해 연결, 병합 해주는 작업.

3) 초기화 

static변수의 값을 할당한다. static의 블럭은 이때 실행된다. 

 

2. Execution Engine 실행엔진 

실행엔진은 클래스로더에 의해 메모리에 적재된 클래스들을 컴퓨터가 이해할 수 있는 기계어로 변경해 명령어 단위로 실행하는 역할을 한다. 이 때 명령어를 한줄씩 번역하여 실행하는 인터프리터 방식이 있고, 바이트코드를 네이티브 코드로 변환하는 JIT Compiler 방식이 있다.

 

3. Runtime Data Area == 메모리 

클래스 파일이 적재되는 장소인 Runtime Data Area에는 5가지 영역이 존재한다.

1) 메서드 영역

JVM이 시작될때 생성되고, 모든 스레드가 공유하는 영역이다.

메서드 영역에는 코드에서 사용되는 클래스들을 클래서 로더로 읽어 클래스 별로 정적필드(static field)와  상수, 메서드 코드, 생성자 코드 등을 분류해서 저장한다. 

JVM이 동작하고 클래서가 로딩될 때 생성되어 JVM이 종료될 때까지 유지된다. 

 

2) 힙 영역 

인스턴스 객체(new)와 배열이 생성되는 영역이다. 여기에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.

ex) Instance instance = new Instance(); 로 생성한 instance는 스택영역에 저장되며 new 연산자로 Instance Test()가 힙 영역에 저장된다. 참조주소인 instance 변수는 스택영역에 저장되지만 실제로 힙 영역의 주소값을 가지고 있다. 

즉, 힙의 참조주소는 '스택'에 저장되고, 해당 객체를 통해서만 힙 영역에 있는 인스턴스를 핸들링 할 수 있다. 

가비지 컬렉터가 제거하기 전까지 유지된다. 

만약 참조하는 변수나 필드가 없다면 의미없는 객체이므로 JVM이 이것을 쓰레기로 취급하고 가비지컬렉터를 실행시켜 자동으로 제거한다. 따라서 개발자는 객체를 제거하기 위해 별도의 코드를 작성할 필요가 없다. (자바는 코드로 객체를 직접 제거할수도 없다.) 

 

3) 스택영역

JVM스택은 메서드를 호출할 때마다 프레임을 추가하고 메서드가 종료되면 해당 프레임을 제거하는 동작을 수행한다.

프레임 내부테는 로컬변수 스택이 있는데, 기본타입 변수(int,log,boolean 등)와 참조타입 변수가 추가되거나 제거된다. 

스택영역에 변수가 생성되는 시점은 초기화 시점, 즉 최초로 변수에 값이 저장 될 때이다.

변수는 선언된 메서드 블록 내에서만 스택에 존재하고, 블록을 벗어나면 스택에서 제거된다.

쉽게말해 임시적으로 사용되는 변수나 정보들이 저장되는 영역이다.

new연산자 객체 생성시 참조 주소값도 저장된다. 

 

4) PC Register

스레드가 생성될 때마다 생성되는 영역이다.

현재 스레드가 실행되는 부분의 주소와 명령을 저장한다. 이를 이용해서 스레드를 돌아가면서 수행할 수 있게 한다. 

스레드가 생성되었을 때, 메서드와 힙 영역은 모든 스레드가 공유한다.

스택, PC register, Native Method Stack 는 공유되지 않는다. 

 

5) Native Method Stack 

자바 외 언어로 작성된 코드를 저장하는 메모리 영역이다. 주로 native 키워드가 붙은 언어들이 저장된다. 

 

 

 

JVM 프로세스

자바소스파일을 자바 컴파일러가 클래스 파일로 변환하고, 클래스 로더가 Runtime Data Area메모리에 클래스 파일을 적재시킨다. 

실행엔진이 자바 메모리에 적재된 클래스들을 기계어로 변환하여 실행하고, 가비지 컬렉터는 힙 영역에 적재된 객체들 중 참조되지 않은 객체를 제거한다. 

반응형