스파이더 웹 개발

JVM 이란? 본문

Java

JVM 이란?

스파이더웹 2022. 7. 21. 15:03
728x90
반응형

JVM(Java Virtual Machine)

자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체이며, CPU나 운영체제의 종류와 상관없이 실행이 가능하다

운영체제 위에서 동작하는 프로세스로 자바코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행하는 역할을 한다

JVM의 구성으로는 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area로 나뉜다

 

Class Loader

클래스를 로드해주는 역할을 한다 .java 소스를 컴파일하면 .class파일이 생성된다

생성된 클래스파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할을 한다

 

동적로딩

C언어의 경우 프로그램을 실행시 포함된 모든 코드를 메모리에 다 로드한다. 이를 정적 로딩이라 한다

반면 자바의 경우(static 제외) 클래스를 프로그램 실행시에 로드하는 것이 아닌 호출된 정보가 필요한 시점에 로딩하는데

이를 동적 로딩이라 한다

즉 요청된것만 그 순간에 로드한다

728x90

Execution Engine

메모리(RuntimeDataArea)에 할당된 바이트코드를 실행하는 역할을 담당한다

바이트 코드는 인간이 읽을 수 있는 형태로 나타내어지는데, Execution Engine을 통해서 기계가 읽을 수 있는 형태로 바이트코드를 변환해주어야 한다 Execution Engine은 바이트코드를 한 줄 마다 읽으며 변환하는 작업을 거친다. 

 

Execution Engine 구성

Interpreter

바이트코드를 기계가 이해할 수 있도록 네이티브 코드로 바꾸는 작업을 한다

바이트코드 한 줄마다 컴파일하여 변환하는 작업을 하며 중복되는 바이트코드에 대해서도  매번 컴파일을 하면 비효율적이며 Running Time 도 길어진다

이러한 중복되는 바이트코드에 대해서는 JIT 컴파일러를 사용한다

 

JIT 컴파일러

JIT 컴파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식이다.

 

Garbage Collector

JVM의 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당됐던 메모리 영역 중에서 
필요없어진 메모리 영역을 회수하여 메모리를 관리해주는 기법입니다.

가비지 컬렉션의 과정으로는
GC의 작업을 수행하기 위해 JVM이 어플리케이션의 실행을 잠시 멈추고  
GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업을 중단 후 
사용하지 않는 메모리를 제거하고 작업이 재개됩니다.

 

Runtime Data Area

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.

이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.

 

모든 스레드가 공유해서 사용 (GC의 대상)

  • 힙 영역 (Heap Area)
  • 메서드 영역(Method Area)

 

스레드(Thread) 마다 하나씩 생성

  • 스택 영역(Stack Area)
  • PC 레지스터 (PC Register)
  • 네이티브 메서드 스택(Native Method Stack)

메서드 영역 (Method Area)

클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static변수, final class 등이 생성되는 영역입니다.

 

힙 영역 (Heap Area)

  1.  new 키워드로 생성된 객체와 배열이 생성되는 영역입니다. 
  2. 주기적으로 GC가 제거하는 영역입니다.

스택 영역 (Stack Area)

지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역입니다.

 

PC 레지스터 (PC Register)

Thread가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 즉 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역입니다.

 

네이티브 메서드 스택 (Native Method Stack)

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.

보통 C/C++등의 코드를 수행하기 위한 스택이다. 

 

 

참조

jvm구조와 자바 런타임 메모리
자바 jvm 내부 구조와 메모리구조
728x90
반응형
Comments