본문 바로가기

JAVA

JAVA, JVM, JDK, JRE

반응형

JAVA "Write once, run everywhere"

 

JAVA Program 실행 과정

  • program이 실행되면 JVM은 OS로 부터 프로그램이 필요로 하는 메모리를 할당 받는다.
  • 자바 바이트 코드(.class 파일)를 OS에 특화된 코드( 네이티브 머신 코드 )로 변환( 인터프리터와 JIT ( just in time)컴파일러에 의해 )
  • 클래스 로더를 통해 JVM으로 클래스 파일들을 로딩하여 실행한다.
  • 로딩된 클래스 파일들은 execution engine을 통해 해석됨
  • 해석된 바이트 코드는 Runtime data areas에 배치되어 실질적인 수행이 이루어지게 된다.

이러한 과정 속에서 JVM은 필요에 따라 Thread Synchronization과 GC를 수행

 

JVM (Java Virtual Machine)

 

  • 자바 가상 머신
  • program이 실행되면 JVM은 OS로 부터 프로그램이 필요로 하는 메모리를 할당 받는다.
  • 자바 바이트 코드(.class 파일)를 OS에 특화된 코드( 머신 코드 )로 변환( 인터프리터와 JIT ( just in time)컴파일러에 의해 )
  • 클래스 로더를 통해 로딩된 클래스 파일들을 실행한다.
  • 바이트 코드를 실행하는 표준(JVM 자체는 표준)이자 구현체(특정 밴더가 구현한 JVM)다.
  • JVM 스팩: https://docs.oracle.com/javase/specs/jvms/se11/html/
  • JVM 밴더: 오라클, 아마존, Azul, ...
  • 특정 플랫폼에 종속적.
  • https://asfirstalways.tistory.com/158

Compiler ? Interpreter ?

참고 > https://blog.naver.com/ehcibear314/221228200531

 

JIT Compiler [ Just In Time ]

참고 > http://blog.naver.com/PostView.nhn?blogId=kbh3983&logNo=220985785358&categoryNo=0&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=postView

 

[JVM] JIT : Just In Time Compiler 개념 & 튜닝

컴파일러와 인터프리터인터프리터는 코드를 한줄 읽고 바로 결과를 출력한다. 같은 기능을 하는 코드가 다...

blog.naver.com

just in time, 즉 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러다
핫 스팟, 즉 자주 실행되는 코드 영역만을 컴파일한다!

먼저, 인터프리터가 동작하여 라인 바이 라인 실행한다. 인터프리터가 코드를 해석하며 컴파일하기에 충분할 정도로 자주 호출되는 메소드와 코드 자주 실행되는 코드 영역을 파악하고 해당 영역만 컴파일 및 최적화( data-analysis, translation from stack operations to register operations, reduction of memory accesses by register allocation, elimination of common sub-expressions etc )를 수행한다.
가령, 실행시간에 타입이 결정되는 경우, Dynamic lookup 이 필요한데, 이러한 동적 실행은 속도가 느려짐. JVM은 이러한 경우, 해당 오브젝트의 타입의 가능성을 열어두고 컴파일한다. 이렇게 최초 컴파일한 바이트 코드는 코드 캐시에 올라감.

PS > 캐시의 크기 조정은 백그라운드에서 동작하며 성능에 영향을 주지 않는다. 코드 캐시의 크기는 머신에서 사용 가능한 물리적인 메모리의 크기에 의존한다. 물리적인 메모리의 크기만 충분하다면 코드 캐시의 최대 크기를 마음껏 늘려도 된다

1. Method JIT
Method JIT 은 메소드 단위로 프로그램을 실행할 때마다 매번 기계어 코드로 변환하는 방식이다.

2. Tracing JIT
인터프리터가 코드를 실행하다가 자주 실행하는 부분만 기계어 코드로 변환하는 방식이다. TracingJIT은 프로그램이 일부 루프 안에서 대부분의 시간을 소비하며, 반복 루프는 유사한 경로를 갖는다고 가정한다. 그래서 코드를 실행하는 중간에 기록(trace)을 해두었다가, 자주 실행하는 부분으로 판단이 되면 기계어로 변환하여 실행한다. 모든 코드를 기계어로 변환하지 않아도 되는 장점이 있지만, 인터프리터와 기계어 사이를 왔다 갔다 해야 하는 비용이 적지 않은 것이 단점이다. 

JRE (Java Runtime Environment): JVM + 라이브러리

  • 자바 애플리케이션을 실행할 수 있도록 구성된 배포판. (최소 단위의 배포 단위)
  • JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일을 가지고 있다.
  • 개발 관련 도구는 포함하지 않는다. (그건 JDK에서 제공)
    ( java module system (jlink) -> jre 구성 가능 )

 

JDK (Java Development Kit): JRE + 개발 툴

  • JRE + 개발에 필요할 툴
  • 소스 코드를 작성할 때 사용하는 자바 언어는 플랫폼에 독립적.
  • 오라클은 자바 11부터는 JDK만 제공하며 JRE를 따로 제공하지 않는다.
  • Write Once Run Anywhere

 

자바

JVM 언어

  • JVM 기반으로 동작하는 프로그래밍 언어
  • 클로저, 그루비, JRuby, Jython, Kotlin, Scala, ...
    코틀린으로 작성한 파일 => jvm class 파일 생성 됨
    ( 단, 컴파일 시에 option 추가 -include-runtime -d **.jar )

 

참고 > 

JIT 컴파일러: https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/

JDK, JRE 그리고 JVM: https://howtodoinjava.com/java/basics/jdk-jre-jvm/

https://en.wikipedia.org/wiki/List_of_JVM_languages

 

반응형

'JAVA' 카테고리의 다른 글

byte code 조작  (0) 2019.09.28
Byte Code  (0) 2019.09.28
Class Loader  (0) 2019.09.28
JVM  (0) 2019.09.28
G1 GC  (0) 2019.08.21