프로그래밍 언어/Java

[JAVA] Java란? (JVM 아키텍처 (2))

hanrabong 2022. 5. 12. 01:08

JAVA 로고

 

저번 글에서 JVM 아키텍처에서 어떻게 class가 memory에 loading이되고 JVM memory 영역은 어떻게 이루어져 있는지에 대해 알아보았습니다. 오늘은 JVM에서 bytecode를 어떻게 실행시키는지에 대해 알아보겠습니다. 이전 글을 읽어야 이해가 조금 더 잘됩니다.

2022.05.11 - [웹/Java] - [JAVA] Java란? (JVM 아키텍처 (1))

 

[JAVA] Java란? (JVM 아키텍처 (1))

요새 Spring boot를 이용하여 백엔드 개발을 하면서 프레임 워크와 마찬가지로 바탕이 되는 언어에 대해 공부하고 기록하려 합니다. 틀린 내용이 있으면 언제든 댓글로 지적해주세요!!  JAVA란?  Jav

hanrabong.com

 

JVM Architecture


 

JVM Architecture

 

3. Execution Engine


 Byte code의 실제 실행이 발생되는 영역입니다. Execution engine은 runtime data area에 할당된 데이터를 읽어서 bytecode의 명령어를 한 줄씩 실행합니다.

 

Interpreter

 byte code를 해석하고 명령을 하나씩 실행합니다. 따라서 하나의 bytecode 라인을 빠르게 해석할 수는 있지만 해석된 결과를 실행하는 것은 느립니다. 하나의 메서드를 여러번 호출할 때마다 매번 새로운 해석과 실행을 해야합니다.

 

Just-in-Time(JIT) Compiler

 Interpreter만 사용할 수 있는 경우 한 method를 여러번 호출할 때마다 매번 interpret해줘야하기에 효율적이지 못합니다. JIT compiler를 이용하여 해결할 수 있었습니다.

 

먼저 전체 byte code를 native code(machine code)로 컴파일합니다. 그런 다음 반복되는 method 호출의 경우 네이티브 코드를 직접 제공합니다. native code를 실행하는 것은 명령어 하나씩 해석하는 것보다 훨씬 빠릅니다. native code는 cache에 저장되므로 더 빠르게 실행할 수 있습니다.

 

하지만, JIT compiler는 반복되는 method의 경우에 장점이 있는 것이지 한 번만 실행되는 코드의 경우 compile하는 것보다 interpret하는 것이 좋습니다. 또한 native code가 저장되는 cache 메모리는 비싼 resource입니다. 

따라서 JIT compiler는 내부적으로 각 method 호출의 빈도를 확인하고 선택된 method가 일정 수준이상 발생한 경우에만 각각을 컴파일하기로 결정합니다.

 

Garbage Collector(GC)

 garbage collection을 수행하는 모듈입니다. 객체가 참조되는 동안 JVM은 해당 객체가 살아있느것으로 간주합니다. 객체가 더 이상 참조되지 않아 application code에서 접근할 수 없으면 garbage collector거 객체를 제거하고 사용하지 않는 메모리를 회수합니다. 일반적으로 garbage collector는 내부적으로 수행되지만 System.gc() 메서드를 호출하여 트리거 할 수 있습니다. 

 

내부 동작에 대해서는 나중에 자세히 다루겠습니다.

 

 

4. Java Native Interface(JNI)


 이 interface는 실행에 필요한 native method library와 상호 작용하고 이러한 native library를 제공하는데 사용합니다. JVM이 C/C++ library를 호출하고 하드웨어에 특정한 C/C++ library에 의해 호출을 가능하게 해줍니다.

 

 

5. Native Method Libraries


 Execution engine(실행 엔진)에 필요한 C/C++ native 라이브러리 모음이며, 제공된 Native interface를 통해 접근 할 수 있습니다.

 

 

 

2개의 글에 걸쳐 JVM 아키텍처가 어떻게 이루어져 있는지 어떤 동작들을 하는지 알아보았습니다. 이제 실제로 이러한 동작을 하는 JVM의 주요 시스템 thread에 대해 알아보겠습니다.

 

 

JVM Thread

 JVM은 여러 thread를 동시에 실행시킬 수 있습니다. Thread 중 일부는 programming logic을 실행시키는데 사용되고 일부는 백그라운드 작업을 수행하기 위해 JVM 자체에서 생성(system thread)됩니다.

 

major application thread는 'public static void main(String[]) 호출의 일부로 생성되는 메인 thread입니다. 다른 모든 application thread는 이 main thread에 의해 생성됩니다. 

 

백 그라운드 작업을 수행하기 위해 JVM 자체에서 생성되는 주요 system thread에 대해 알아보겠습니다.

 

  • Compiler threads: runtime에 bytecode를 native code(machine code)로 컴파일 하는 작업을 수행
  • GC threads: 모든 GC관련 활동을 수행
  • Periodic task thread:주기적 작업 실행을 예약하기 위한 타이머 이벤트를 수행
  • Signal dispatcher thread: JVM 프로세스로 전송된 신호를 수신하고 적절한 JVM method를 호출하여 JVM 내부에서 처리

 

 

이전 글과 이번 글을 통해 JVM architecture에 대해 알아보았습니다. JAVA 언어가 가지고 있는 특징이 어떻게 JVM에서 이루어지고 있는지에 대해 알게 되었습니다.

 

 

 

여기서 간략하게 다뤘던 내용들과 JAVA를 직접 사용해 보면서 중요하다고 느끼거나 헷갈리는 개념에 대해 차차 정리해 보겠습니다.

 

 

 

※ 밑의 블로그를 참고하여 정리 하였습니다. 이해가 안 가거나 틀린 내용은 언제든지 댓글 달아주세요

 

 

참고자료

https://medium.com/platform-engineer/understanding-jvm-architecture-22c0ddf09722

 

Understanding JVM Architecture

Understanding JVM architecture and how Java really works under the hood is an important learning for every Java developer.

medium.com