1. JVM이란?


C 프로그램의 실행 프로세스를 한 번 생각해보자.

  1.  preprocessor를 거쳐 코드가 확장된다.
  2. 확장된 코드는 compiler를 통해 어셈블리 코드로 변환된다.
  3. 변환된 어셈블리 코드는 assembler를 통해 바이트 코드를 가진 .obj 파일로 변환된다.
  4. .obj 파일은 linker를 통해 외부의 라이브러리 코드와 연결시킨 후, 실행 파일(.exe 등)을 생성한다.
  5. 실행이 가능해진 코드는 loader를 통해 메모리에 로드되고, 기계는 이를 해석하며 그에 따라 동작한다.

 

C 프로그램은 위와 같은 프로세스를 머신에서 수행하고, Java는 가상머신을 이용해 이와 같은 프로세스를 처리한다.

JVM이 하는 일은 크게 3가지

  1. 코드를 로드하고, 검증하고, 실행한다.
  2. OS로부터 메모리를 할당받아 관리한다.
  3. 최종적으로 Java 프로그램이 실행될 수 있는 Runtime Enviroment를 제공해준다.

 

당연히, Java 프로그램이 실행되는 머신의 특성을 알면 퍼포먼스를 최대로 끌어낼 수 있게되겠지 ?

 

2. Java 프로그램의 실행 프로세스


Java 프로그램의 실행 프로세스를 살펴보자.

  1. .java 파일은 javac( java compiler )를 통해 바이트 코드를 가진 .class 파일로 변환된다.
  2. 변환된 .class 파일은 JVM을 거쳐 실행되는데, 이때 3가지 스텝을 밟는다.
        1) Class Loader
        2) Bytecode Verifier
        3) Just-In-Time Compiler

 

JVM이 .class 파일을 실행하는 세 가지 단계에 대해서 알아보자.

 

1) Class Loader

main class가 가장 먼저 JVM에 의해 메모리에 로드된다. ( main class란 시작점인 main 메서드를 가지는 클래스 )

JVM에서는 두 가지의 클래스 로더가 존재하는데, 하나는 primordial이고, 다른 하나는 non-primordial이다.

primordial은 JVM에서 기본으로 제공하는 클래스 로더를 말하고, non-primordial은 사용자가 만든 클래스 로더를 말한다.

 

2) Bytecode Verifier

.class 파일이 클래스 로더에 의해 메모리에 로드되었다면, Bytecode Verifier는 해당 바이트 코드에 위험요소는 없는지 체크한다.

  • 변수가 초기화되기 전에 사용되었는지
  • 메서드 호출은 적절한 객체에 의해서 호출되었는지
  • 로컬 변수가 런타임 스택공간을 벗어나는 접근을 하지는 않는지
  • 런타임 스택공간이 오버플로우되지는 않는지

 

3) Just-In-Time Compiler

JIT 컴파일러는 로드된 바이트 코드를 기계어 코드로 변환하는 작업을 수행한다.

JVM 인터프리터의 경우 매번 코드를 해석하여 변환하는데 반면,

JIT 컴파일러는 같은 코드를 매번 해석하는 대신, 처음 실행될 때 인터프리트하면서 자주 쓰이는 코드를 캐싱하여 이를 재사용한다.

JIT 컴파일러보다는 JIT 인터프리터라는 용어가 더 적절하며, 인터프리터 언어가 성능 향상을 목적으로 도입하는 경우가 많다.

 

 

3. 참고자료


[1] https://www.geeksforgeeks.org/compilation-execution-java-program/

[2] https://asfirstalways.tistory.com/158

[3] https://namu.wiki/w/JIT

[4] https://betsol.com/java-memory-management-for-java-virtual-machine-jvm/

 

'Programming > Java' 카테고리의 다른 글

[Java] 테스트를 위한 환경 구성  (0) 2020.05.28
[Java] XML 파싱  (0) 2020.05.13
[Java] try-with-resources로 쉽게 자원해제하기  (0) 2020.04.17
[Java] NIO  (0) 2020.04.17
[Java] Atomic Type  (0) 2020.04.13