본문 바로가기

Java

[Java] JVM 구성에 대한 공부

JVM(Java Virtual Machine)

OS에 종속받지 않고 CPU가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다.

 

위 그림은 자바가 어떻게 동작하는지 간단하게 나타낸 그림이다.

그림에서 자바 소스코드(.java) 를 Java Compiler(.javac)가 자바 바이트 코드(.class)형식으로 컴파일한다.

바이트 코드란 JVM이 알아들을 수 있는 명령어 집합을 이야기한다.

Class Loader를 통해서 컴파일된 바이트코드를 JVM Runtime Data Area로 로딩한다.

 

위 그림은 JVM 부분만 상세하게 나타낸 그림이다.

 

클래스 로더(Class Loader)

JVM 내로 클래스 파일(.class)을 Load 하고, Loading 된 클래스들을 Runtime Data Area의 Method Area에 배치된다.

또한 이 메모리를 검증하고 static 변수를 초기화하는 역할을 한다.

실행 엔진(Execution Engine)

Runtime Data Area의 Method Area에 배치된 Loading 클래스 파일을 실행시키는 역할을 한다.

실행 엔진(Execution Engine)은 바이트코드를 명령어 단위로 읽어서 실행한다. 

인터프리터(Interpreter)

여기서 인터프리터(Interpreter)가 Runtime Data Area의 Method Area에 배치된 Loading 파일을 바이트코드로 번역해 주는 역할을 한다. 실행 중 프로그래밍 언어를 한 줄씩 읽어 가면서 해당 기능을 실행한다.

JIT(Just-In-Time)

실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.

가비지 콜렉터(CG).

더 이상 사용하지 않는 메모리를 삭제한다.

Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다.

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

JVM의 메모리 영역은 런타임데이터 영역이다. 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간이다.

아래 그림에서 Thread 부분은 서로가 침범할 수 없는 영역이다. 

Method Area

클래스 로더에서 받은 데이터가 배치되는 영역이다. 

클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간으로 class 대한 모든 정보가 저장되어 있다. 

Runtime Constant Pool

상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행한다.

Heap 

런타임에 생성되는 모든 객체와 배열을 저장한다.

가비지 컬렉터가 Heap영역의 객체를 탐색하고 삭제한다.

 

JVM Stack

메서드를 실행하기 위한 정보들을 저장하는 공간이다. 내부에 프레임이라는 자료구조가 존재한다. 이는 메서드가 호출될 때마다 새로 생성된다. 메서드가 끝나거나 예외가 터지면 사라진다.

PC Register

현재 실행되고 있는 명령어의 주소를 저장하고 있는 영역이다. 멀티스레드 프로그래밍 환경에서 한 스레드가 작업하다가 다른 스레드로 잠시 cpu 점유를 넘겨주고 돌아왔을 때 이전에 어떤 명령을 하고 있는지 기억하고 있어야 이전 작업을 다시 이어서 수행할 수 있다. 그래서 이를 저장하고 있는 게 PC Register이다.

Native method stack

Java가 아닌 C, C++, 어셈블리 등으로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역이다.

 

 

 

출처 :

 

https://coding-factory.tistory.com/828

https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80

https://inpa.tistory.com/entry/JAVA-%E2%98%95-JVM-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD-%EC%8B%AC%ED%99%94%ED%8E%B8