[Java] JVM과 구성 요소

2022. 11. 8. 00:35카테고리 없음

JVM이란?

자바를 실행시키기 위한 가상 머신.

java는 JVM을 거쳐 OS에 도달하므로 OS에 종속적이지 않다.

 

=> .java 파일은 컴퓨터가 인식하지 못하므로 컴파일을 해줘야한다.

     이 때 JVM이 인식할 수 있는 .class 파일(byte code)로 변환해주고, JVM이 byte code를 OS가 인식할 수 있도록 도와준  다.

자바 파일 실행 과정

 

JVM 구성 요소

JVM 구성 요소

  • 클래스 로더(Class Loader)
  • 실행 엔진(Execution Engine)
    • 인터프리터(Interpreter)
    • JIT 컴파일러(Just-in-Time)
    • 가비지 콜렉터(Garbage collector)
  • 런타임 데이터 영역 (Runtime Data Area)

 

1) 클래스 로더 

- 런타임 시점에 JVM 내로 .class 파일을 메모리에 올리는 역할을 담당하며 세 가지 과정을 거친다.

  •  로딩
    • 클래스 파일을 바이너리 테이터로 변환해 메모리 영역에 저장
    • 변수, 메소드, 인터페이스, 클래스 파일 등

 

  • 링크
    • .class 파일이 유효한지 체크
    • 필요한 메모리 준비

 

  • 초기화
    • static 변수에 값 할당

 

 

2) 실행 엔진

- 클래스를 실행시키는 역할

- 클래스 로더로부터 메모리에 올라온 파일들(.class)을 실제로 기계가 실행할 수 있는 코드로 변형시키는 역할을 한다.

  • 인터프리터   
    • .class 파일을 명령어 단위로 읽어서 실행
    • 한 줄씩 실행해서 느리다는 단점이 있음

 

  • JIT (Just In Time) Compiler
    • 바이트 코드를 어셈블리같은 네이티브 코드로 바꿈으로서 실행이 빠르지만 변환하는데 비용이 발생
    • JIT 컴파일러는 같은 코드를 매번 해석하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱한다. 이후에는 바뀐 부분만 컴파일하고, 나머지는 캐싱된 코드를 사용한다. 
    • 때문에 JVM은 모든 코드를 JIT 방식으로 실행하지 않고 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 방식을 사용한다.

 

  • 가비지 컬렉터(GC)
    • 힙 메모리에서 더 이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제하는 역할을 하고 이로써 힙메모리를 재사용할 수 있게 된다는 장점을 가진다.

 

 

3) Runtime Data Area

프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간으로 5가지로 구분된다.

  • Method Area
    • 모든 쓰레드가 공유하는 메모리 영역
    • .class파일을 메모리에 올릴 때 초기화되는 대상을 저장하기 위한 영역이다.

 

  • pc 레지스터
    • 쓰레드가 시작될 때 생성되며 쓰레드마다 하나씩 존재한다.
    • 쓰레드가 어떤 동작을 실행 하게 될지에 대한 부분을 저장한다.

 

  • Stack Area
    • 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역이다.
    • 메소드 실행을 위해 임시로 할당되었다가 메소드 실행이 끝나면 소멸된다.

 

  • Heap Area
    • 모든 쓰레드가 공유하는 메모리 영역
    • 객체를 저장하는 공간으로 new로 만들어진 객체와 배열을 저장한다.
    • 가비지 컬렉터의 대상 관리가 된다.

 

  • Native Method Stack
    • 자바 외의 언어로 작성된 네이티브 코드들을 위한 스택이다.