본문 바로가기
Java & Kolin

JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

by Limm_jk 2021. 3. 30.

1. JVM

JAVA와 OS사이에 중재자 역할을 해주면서 재사용성을 증가시킴

스택기반의 가상머신, 메모리관리 및 GC를 수행함

  1. 실행시 JVM은 OS에서 필요한 메모리를 할당받는다.
  2. javac(Java Compiler)가 .java파일을 .class파일(Byte Code)로 변화시킨다
  3. Class Loader가 런타임 시점에 Class파일을 JVM으로 로딩한다
  4. 로딩된 Class파일은 Execution Engine을 통해 해석된다
  5. 해석된 코드는 Runtime Data Area로 이동하여 실행된다.
  6. 실행 간에 지속적으로 메모리 관리가 이루어진다.

2. JVM의 요소

Class Loader

class 파일 / ByteCode를 메모리에 로드한다. 객체가 생성되는 과정이라고 볼 수 있다?

상속이 된다.

load 요청의 위임 -> 클래스 요청을 받을 때, 

Garbage Collector

Java는 C처럼 사용자가 직접 메모리 관리를 하지 않고, JVM이 알아서 대신 해준다.

필요하다고 여겨질 때, mark & sweep을 통하여 메모리를 정리한다.

이 때, Stop the World가 일어나서 성능에 영향이 발생하므로 최대한 적게 발생하도록 설계해야한다.

Excution Engine

위의 class loader를 통하여 로드된 Byte Code / Class 파일을 해석하고 실행시키는 역할을 한다.

인터프리터 방식과 Just in Time 방법 두가지가 사용이 된다.

Runtime Data Area

실행을 위해 메모리에게 미리 할당받은 공간을 의미하며, 사용성에 따라서 5개의 공간으로 분류할 수 있다.

스택 -> 함수 콜 -> 리턴 시 바로 팝

힙 -> 큐로 진행 / 순서를 예측할 수 없으므로 / 정렬에 이점이 있음

 

3. compiler

위에서 서술한 javac(Java Compiler)가 .java파일을 .class파일로 변화시킨다에 해당된다.

 

4. Interpreter vs Just in Time

인터프리터 방식의 해석 및 실행과정은 한 줄씩 읽어서 해석 후 실행시키는 방법을 의미한다.

이 때, 한 줄씩 읽어서 해석시킨다면 메소드가 다시 호출되었을 때, 중복하여 해석하므로 성능에 누수가 발생한다.

 

이러한 성능 누수를 방지하기 위하여 한 줄씩 해석하며 해석된 코드를 캐싱한다.

이렇게 캐싱된 코드는 같은 메소드가 호출되었을 때, 재사용되며 중복 해석하는 문제를 방지한다.

 

 

댓글