아무거나 개발공부/JAVA 기초다지기

JAVA 기초다지기 (2) - JVM

코드 살인마 2022. 7. 15. 22:30
728x90

JVM이란?

  • JVM(Java VIrtual Machine)은 자바 가상 머신으로 다양한 플랫폼(OS)위에 가상 머신 역할로 자바로 개발한 바이트 코드(.class 파일)가 실행될 수 있도록 런타임 환경을 제공하며 각 플랫폼별 JVM은 오라클이나 Open JDK 개발사들이 제공한다. 이렇기에 플랫폼 독립적인 언어
  • JVM이 구동되면 OS에서 프로세스 형태의 Runtime instance로 구동된다.
  • JVM의 주요 Task : 코드 로드/확인/실행, 런타임 환경 제공
  • JVM 제공하는 기능 : 메모리 영역, 클래스 파일 형식, 레지스터 세트, 가비지 콜렉터, 치명적 오류 보고 등

JVM Architecture

  • JVM 내부구조는 Class Loader, Memory Area, Execution Engine 을 포함한다.
  • 동작 흐름 : 클래스 로더를 클래스 파일을 로드
  • Class Area : Runtime의 Constant pool(상수 풀), Field, Method data, Method에 대한 코드, 클래스별 구조를 저장한다.
  • Heap Area : Runtime의 객체가 할당되는 데이터 영역
  • Stack Area : 주로 로컬변수를 저장하는 데이터 영역이다. 각 스레드별로, Private JVM Stack이 생성됨
  • Execution Engine : 실행 엔진에는 다음과 같은 것들이 포함되어 있다.\
    • Interpreter(인터프리터) : 바이트코드(.class 파일)를 기계(OS에 맞는)가 이해할 수 있는 형태(native code)로 해석하고 명령을 실행한다.
    • JIT Compiler : Java의 인터프리터는 런타임에 바이트코드를 매번 읽어들여 해석하는 느린속도를 해결하기 위해 사용된다.
      • 자주 실행되는 코드를 파악 > 동일한 코드를 매번 해석하지 않고 기계어로 컴파일해서 캐싱하여 재사용 > 성능을 향상시킨다.
      • 실행 기록의 통계 정보로 자주 사용되는 코드들을 확인한다.
    • Garbage Collecter : 더 이상 사용되지 않는 객체들을 수집하고 제거하는 역할
  • Native Method stack : 응용프로그램에서 사용되는 Native Method 정보를 가지고 있고, 각 스레드 별로 개별 Native Method stack이 생성된다.
  • Native Method interface : Native Method Libraries와 상호작용하며 Execution Engine을 위해 Native Libraries를 제공합니다.

Java ByteCode

  • 자바컴파일러에 의해 생성되는 JVM 해석용 코드로 CPU에 의해 실행되지 않고 JVM이 Interpret 과정을 거쳐 OS에 전달하는 바이너리 형태의 명령어 코드
  • JVM의 위한 언어로 JVM이 바이트 코드를 해석할 수 있는 한, JVM이 어떤 OS에 설치되어 있어도 동일하게 해석되고 동작된다.
  • Disassemble the Code
    • 컴파일된 Class의 바이트코드를 JDK에서 제공하는 JAVAP 커맨드로 역어셈블하여 클래스 파일내의 바이트코드 목록을 추출할 수 있고, 메소드의 목록을 간단히 볼 수 있다.
    • 바이트코드는 사람이 쉽게 알아볼 수 있도록 문자화한 니모닉으로 되어있다.
    • 인텔리제이 하단의 Terminal 탭을 클릭 > terminal 창에서 아래와 같이 입력
      • cd our/production/EduExample/ch01
      • javap -c HelloWorld