SMALL

JVM의 구성요소 중에 Execution Engine에 해당하는 내용을 살펴보도록 하겠다

  • Execution Engine이란
  • Execution Engine의 구성요소
    • Interpreter
    • JIT(Just In Time) Compiler
    • Garbage Collector

 


Execution Engine이란

 

JVM은 Java 컴파일러가 컴파일한 ByteCode를 ClassLoader를 이용해 메모리(RuntimeDataArea)에 실행 가능한 상태로 적재한다.

Execution Engine은 메모리(RuntimeDataArea)에 할당된 byteCode를 실행하는 역할을 담당한다.

ByteCode는 human-readable형태로 나타내어진다, 그러므로 Execution Engine을 통해서 Machine이 읽을 수 있는 형태로 ByteCode를 변환해 주어야 한다. 

Execution Engine은 ByteCode를 한 줄 마다 읽으며 변환하는 작업을 거친다. 

( CPU가 command를 실행하는 방식과 유사하게 동작)

( 각 command의 ByteCode의 구성은 1byte의 OpCode와 추가적인 Operand로 구성되었다) 

다만, Execution Engine이 어떠한 형태로 실행되여야 하는지는 JVM specification에 나타나지 않아, 해당 구현은 vendor에 따라 달라질 수 있다. 


Execution Engine의 구성요소

Interpreter

ByteCode를 기계가 이해할 수 있도록 Native Code로 바꾸는 작업을 한다

ByteCode 한 줄마다 컴파일을 하여 Native로 변환하는 작업을 하게 되는데 중복되는 Byte Code들에 대해서도 매번 컴파일을 하게 되면 비효율적이며 Running Time도 길어지게 된다

이러한 중복되는 Byte Code에 대해서는 JIT 컴파일러를 사용한다.

 

JIT(Just In Time) Compiler

Interpreter 효율을 높히기 위해 Interpreter가 반복되는 코드를 발견하면 JIT 컴파일러로 반복되는 코드를 모두 Native Code로 바꾼다.
그렇게 되면 반복된 Byte Code는 Native Code로 바뀌어 있기 때문에 Interpreter가 바로 사용할 수 있게 된다.

 

Garbage Collector

RuntimeDataArea의 Heap 영역의 더 이상 참조되지 않는 객체를 정리한다

이에 대한 내역은 Garbage Collector를 자세히 다루는 포스팅으로 소개하도록 하겠다.

 

LIST
SMALL

Java에서는 Date 표현에 해당하는 다양한 Class들을 제공한다.

대표적으로는 java.util.Date Class와 java.time.LocalDateTime Class가 있을 수 있다.

 

각각의 Class에 특징에 대해서 살펴보고, 정리해 보도록 하자

 

java.util.Date 클래스는 JDK 1.1 버전부터 지원하는 클래스였지만 다양한 문제가 제기되면서, 많은 기능들이 deprecated 되었다. 

java.util.Date 클래스의 문제점을 간단히 정리해 보면 아래와 같다 

  • 불변 객체가 아니다
  • int 상수 필드의 남용
  • 헷갈리는 월지정 및 일관성 없는 요일 상수

이 중 가장 불편한 점은 Mutable 객체라는 점이다. Date의 값이 변경되면 멀티 스레드 환경에서 불안정성 등의 부작용이 나타날 수 있게 된다. C#, Python 같은 언어에서는 날짜 클래스가 한번 생성된 이후에는 내부 속성을 바꿀 수 없다.

 

실제 Date 클래스를 사용하는 코드를 살펴보자

Date date_now = new Date(System.currentTimeMillis()); // 현재시간을 가져와 Date형으로 저장한다
System.out.println(date_now); // 기본 포멧으로 출력한다
		
SimpleDateFormat fourteen_format = new SimpleDateFormat("yyyyMMddHHmmss"); 
String str_source = fourteen_format.format(date_now); // 14자리 포멧으로 출력한다
System.out.println(str_source); 
		
SimpleDateFormat input_format    = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 입력포멧
Date date_parsed = fourteen_format.parse(str_source); // 문자열을 파싱해 Date형으로 저장한다
String str_parsed = input_format.format(date_parsed);
System.out.println(str_parsed);

 

JDK 1.8버전에서 java.time 패키지에 LocalDateTime과 타임존 개념까지 포함할 수 있는 ZonedDateTime이 추가되었다. 이 패키지에서 제공하는 모든 class들은 immutable 하기 때문에 thread-safe 하게 사용 가능하다.

 

실제 LocalDateTime 클래스를 사용하는 코드를 살펴보자

LocalDateTime nowDateTime = LocalDateTime.now();
// 2018년 12월 11일 15시 23분 32초, 2018-12-11T15:23:32
LocalDateTime ofDateTime = LocalDateTime.of(2018, 12, 11, 15, 23, 32);
System.out.println(ofDateTime);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
String formatted = formatter.format(ofDateTime);
formatted = ofDateTime.format(formatter);
LocalDateTime parsedDate = LocalDateTime.parse(formatted, formatter);

 

LIST

+ Recent posts