본문 바로가기
Language/Java

[Java] JVM - Java virtual machine

by hongdor 2023. 4. 10.
728x90

Java virtual machine - Wikipedia

 

Java virtual machine - Wikipedia

From Wikipedia, the free encyclopedia Java Virtual machine Overview of a Java virtual machine (JVM) architecture based on The Java Virtual Machine Specification Java SE 7 Edition A Java virtual machine (JVM) is a virtual machine that enables a computer to

en.wikipedia.org

Wikipedia를 참고해 내용을 정리했다.

 

 

1. JVM 개요

  • java bytecode로 컴파일 될 수 있는 언어들을 실행할 수 있는 가상 머신
  • 가상 머신은 하드웨어가 달라도 실행 가능하도록 호환성을 보장한다.
  • JVM은 OpenJDK project에서 오픈소스로 개발된다

 

2. JVM 명세

  • JVM은 사양이 정의된 가상 컴퓨터 이다.
  • 이 이후에 내용은 정의된 사양에 관한 내용이다

 

3. Class loader

  • JVM 바이트 코드의 구성 단위 중 하나는 class 이다.
    (바이트 코드로 작성돼 있는 파일 중 일부가 .class 확장자 형식의 파일이다)
  • Class loader는 Java의 .class 확장자 파일 형식을 인식하고 로드할 수 있어야 한다.
  • 순서는 아래와 같다
    • Loading: 타입에 대한 binary 데이터를 찾고 가져온다.
    • Linking : Verification, Preparation, Resolution
      • Verification : 가져온 타입이 정상적인지 확인한다
      • Preparation : class 변수들을 위한 메모리를 할당하고 초기값을 할당한다
      • Resolution : 상징적 참조를 직접 참조로 변환한다. (Symbolic references in Java - Stack Overflow)
    • Initialization : 클래스 변수를 적절한 시작 값으로 초기화 하는 Java 코드 호출한다
  • 일반 적으로 3가지 타입의 class loader가 있다.
    • bootstrap class loader
    • extension class loader
    • application class loader

 

4. Architecture

  • JVM은 구체적인 타입의 데이터들로 동작한다.
    • type은 primitive 타입과 reference 타입이 있다.
    • primitive 타입 : int, long 등
    • reference 타입 : Class, Interface, Array 등
  • heap
    • Garbage Collector가 동작한다
    • 오브젝트들과 배열들은 저장한다.
  • method area
    • 따지자면 heap의 일부분 이지만 보통 구분한다.
    • 코드와, 상수, 클래스 정보 등이 저장된다.
    • Garbage Collector가 동작하지 않는다.
  • call stack
    • 각 thread마다 call stack을 가지고있다.
    • frame들을 저장한다.
      • frame은 메서드가 불려질때 생성되고 끝날때 없어진다.
      • 각 frame은 operand stack과 지역 변수들의 배열을 제공한다.
        • operand stack(피연산자 스택)
          • 계산을 위한 operand들에 사용된다.
          • 메서드의 return 값을 받는데 사용된다.
        • 지역 변수들
          • 메서드 인자를 전달하기 위해 레지스터와 같은 용도로 사용된다.
    • JVM은 stack machine & register machine 이다.

 

5. Bytecode instructions (List of Java bytecode instructions - Wikipedia)

  • JVM은 Operand stack management (push/pop) 등과 관련된 일들의 instruction을 가지고 있다
    (instruction은 JVM 명령어 문법이라고 생각하면 된다 -)
  • 운영체제마다 JVM과 runtime의 구현이 필요하다.
  • JVM은 bytecode를 동일하게 해석하지만, (운영체제마다) 실제 구현을 다를 수 있다.
  • 각 운영체제에 맞게 Java core API를 호환성있고 효율적으로 구현해야 한다.
  • 내생각 - 즉, instruction 명령어를 운영체제에 맞게 구현해야함.

 

6. JVM languages

  • JVM language란 JVM에서 동작하는 class 확장자 파일로 바뀔 수 있는 언어이다.
  • class 파일
    • class 파일은 JVM instruction들과 sysmbol table 등을 포함하고 있다.
    • class 파일은 컴파일된 class와 interface들을 표현하기 위한 hardware와 OS 종속적인 binary foramt이다.
    • JRuby, Jython는 Rupy Python을 포팅한 것이다
    • 새로 만들어진 언어 중 인기 있는 언어는 Clojure, Groovy, Scala, Kotlin 등이 있다.
  • JVM 언어들은 서로 호환이 가능하다. java 프로그램에 scala 라이브러리가 쓰일 수 있다.
  • java7 JVM 부터는 동적 타입 언어도 지원한다.

 

7. Bytecode verifier

  • 실행되기전 모든 byte code를 검증한다. 3가지로 타입으로 이뤄져 있다.
    • branch들이 유효한 위치에 있는지.(코드의 흐름을 벗어나는지 확인)
    • 데이터는 초기화되고 참조는 type-safe 한지.
    • private 한 data와 method에 대한 접근은 통제되는지
  • 첫번째와 두번째는 class가 로딩될 때 검증한다.
  • 세번재는 동적으로 다른 class가 data와 method에 처음 접근할 때 이루어진다.

 

8. Bytecode interpreter and just-in-time compiler(JIT)

  • hardware architecture 마다 다른 Java bytecode interpreter가 필요하다
  • Java byte code가 interpreter에 의해 실행 될때 native machine language보다 느렸다. 그래서 JIT 컴파일러가 탄생
  • JIT 컴파일러
    • just-in-time 컴파일러
    • JIT 컴파일러는 프로그램을 실행하는 동안 Java bytecode를 native machine language로 변환할 수 있다.
    • 변환된 프로그램 일부분은 interpreter보다 빠르게 동작한다.
    • 이 기술은 프로그램의 자주 실행되는 부분에 적용된다
    • Java가 Java byte code(.class)로 반드시 연결될 필요는 없다. 곧바로 기계어로 컴파일할 수 있다.
      혹은 다른 언어가 Java byte code로 컴파일될 수도 있다.
    • 일부 JVM 구현에 인터프리터 없이 JIT 컴파일러만 있는 경우도 있다.

 

9. 정리 (내생각)

  1. java(.java)가
  2. java byte code(.class) 로 변환
  3. JVM 이 실행
    1. JVM 은 하드웨어와 운영체제에 따라 구현 필요
    2. JVM 은 요구사항들을 구현해야 함
      1. class loader(loading, linking, Initialization)
      2. architecture(heap, method area, call stack)
      3. bytecode instruction list - java bytecode를 구성하는 명령어들
      4. verifier(코드 순서, 데이터 초기화 & type-safe, private 접근제한)
      5. interpreter & JIT compiler
728x90

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

[Java] GC - Garbage Collector  (0) 2023.04.10

댓글