[JAVA] JVM 구조

devnoong·2022년 7월 10일
0

JAVA

목록 보기
1/2

JVM 이란?

JavaVirtualMachine의 줄임말로 OS에 종속되지 않고 CPU가 JAVA를 인식 및 실행 할 수 있게 도와주는 가상 장치를 뜻한다.

  1. 자바 소스 코드로 작성된 자바 파일은 Javac라는 Java 컴파일러에 의해 JVM이 해석 할 수 있도록 바이트 코드 형태인 클래스 파일로 변환됨.

  2. 바이트코드 형태인 class파일은 ClassLoader를 통해 JVM 메모리에 할당 되고 실행 엔진에 의하여 기계어(바이너리코드)변환 된다.

  3. CPU는 바이너리코드를 읽어 컴퓨터가 이해하고 수행 할 수 있도록 Runtime Data Area에 배치되어 실질적인 수행을 처리해준다.

즉, 컴파일과 실행이 동시에 일어나는 것이 아닌 ① 컴파일 과정 ② 실행 과정 이렇게 분리돼서 수행된다.

① 컴파일 과정은 javac를 이용한 JVM을 수행하기 위한 프론트엔드 단계라고 생각하면 쉽다.
② 변환 및 실행 과정은 OS에 알맞는 기계어로 번역하기 위해 컴파일 후 수행하는 전반적인 백엔드 단계라고 생각하면 된다.

바이트코드로 컴파일된 클래스 파일은 ①인터프리터 방식② JIT 컴파일러 방식에 의해 바이너리코드 (기계어)로 재해석이 된다.

① 인터프리터 방식

  • 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.

  • 한 줄씩 수행하기 때문에 느리다는 단점이 있다.

② JIT(just-in-time compliation) 컴파일러 방식

  • 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 네이티브 코드로 변경 후 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식이다.

  • 바이트 코드를 인터프리팅하는 것보다 훨씬 오래걸린다.

  • JIT 컴파일러를 사용하는 JVM들은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고 일정 정도를 넣을때에만 JIT컴파일을 수행한다.


자바에선 실제 바이트 코드를 실행하는 시점에서 자바 가상 머신(JVM, 정확히는 JRE)이 바이트 코드를 JIT 컴파일을 통해 기계어로 변환한다.



JVM 구조

  • 클래스 로더(Class Loader)

  • 실행 엔진(Execution Engine)
    ① 인터프리터(Interpreter)
    ② JIT 컴파일러(Just-in-Time)
    ③ 가비지 콜렉터(Garbage collector)

  • 런타임 데이터 영역 (Runtime Data Area)
    ① PC Register
    ② JVM 스택 영역
    ③ Native method stack
    ④ Heap
    ⑤ Method Area

						https://jwjwj.tistory.com/23

▶ 클래스 로더(Class Loader)

JVM 내로 클래스 파일(*.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.

런 타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재한다.

즉, 클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크한는 역할을 한다.


▶ 실행 엔진

클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 실행 엔진에 의해 실행된다.

실행 엔진은 이와 같은 바이트 코드를 JVM 내부에서 ① 인터프리터방식과 ② JIT 컴파일러를 이용해서 기계가 실행할 수 있는 형태로 변경한다.


▶ 런타임 데이터 영역(Runtime Data Area)

프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간이다.

					https://jwjwj.tistory.com/23

① PC Register

Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로, 스레드마다 하나씩 존재한다.

Thread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소(스택 프레임의 주소)를 갖는다.

② JVM 스택(Stack) 영역

프로그램 실행 과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다.

메소드 안에서 사용되는 값(원시값 , Heap영역에 생성된 Object타입의 데이터 참조값)들을 저장한다.

호출된 메소드의 매개변수, 지역변수, 리턴 값연산 시 일어나는 값들도 임시로 저장한다.

③ Native method stack

자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역.

JAVA가 아닌 다른 언어(C, C++ = Low Level Language)로 작성된 코드를 위한 공간.

각각의 Thread는 PC Register + JVM 스택(Stack) 영역+ Native method stack 로 이루어져 있다.

Thread 종료시 같이 종료 된다.


Heap

Object타입의 데이터가 저장된다.
어플리케이션의 모든 메모리중 STACK을 제외한 모든 부분을 나타낸다.

STACK 달리 자동으로 메모리를 관리해주지 않기때문에 실행 엔진의 가비지컬렉터가 사용하지 않는 메모리를 관리해준다.

⑤ Method Area

클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간으로, 클래스 데이터를 위한 공간이다.

프로그램의 클래스 구조를 메타데이터처럼 가지며, 메서드의 코드를 저장한다.

올라가는 정보의 종류는 필드정보 , 메소드에 대한 정보 , 타입에 대한 정보가 올라간다.

즉, 컴파일 된 바이트 코드의 대부분은 메소드영역이기때문에 거의 모든 데이터가 올라간다고 볼 수 있다.

Heap 영역과 마찬과지로 가비지 컬렉터의 대상에 포함된다.

Runtime Constant Pool이라는 별도의 관리 영역이 존재하고,
상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행한다.

모든 Thread는 Heap과 Method Area 영역을 공유한다.


profile
backend Developer

0개의 댓글