코딩하는 털보

STUDY HALLE - 1주차 본문

Diary/Study Halle

STUDY HALLE - 1주차

이정인 2020. 12. 18. 17:21

STUDY HALLE

1주차 : JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.


목표

자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.

학습할 것

  • JVM이란 무엇인가
  • 컴파일 하는 방법
  • 실행하는 방법
  • 바이트코드란 무엇인가
  • JIT 컴파일러란 무엇이며 어떻게 동작하는가
  • JVM 구성 요소
  • JDK와 JRE의 차이

JVM이란 무엇인가

JVM (Java Virtual Machine)

: 자바 바이트 코드를 OS에 특화된 네이티브 코드로 변환하여 실행하는 표준이자 구현체.

  • 여러 JVM 밴더(오라클, 아마존, Azul, ...)에서 구현하여 다양한 구현체가 있다.
  • 네이티브 코드가 특정 OS에 맞춰져 있기 때문에 특정 플랫폼에 종속적이다.
  • JVM으로만 배포되지 않는다. (최소한의 배포단위는 JRE이다.)
  • 여러 프로그래밍 언어가 JVM 기반으로 동작할 수 있다. (Java, Jython, JRuby, Kotlin, Scala, 클로저, 그루비, ...)

Java

: 프로그래밍 언어

  • JDK에 들어있는 자바 컴파일러(javac)를 통해 바이트 코드(.class)로 컴파일할 수 있다.

컴파일 하는 방법

자바 컴파일러(javac)를 이용하여 자바 소스 파일(.java)을 바이트 코드로 컴파일하기.

 

javac 'options' 'javasourcefile'

[/Users/ijeong-in/Git_repo/Java_Study/studyHalle]> cat Hello.java
public class Hello {
    public static void main(String args[]) {
        System.out.println("hello java study halle");
    }
}
[/Users/ijeong-in/Git_repo/Java_Study/studyHalle]> javac Hello.java 
[/Users/ijeong-in/Git_repo/Java_Study/studyHalle]> ls
Hello.class    Hello.java

options

-classpath : 컴파일에 필요한 라이브러리나 클래스 파일들의 경로를 지정할 수 있다.

-d : 컴파일 후 클래스 파일을 생성할 디렉터리를 지정할 수 있다.

그 외 옵션들

https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html


실행하는 방법

바이트 코드 실행하기.

 

java 'options' 'classfiles' 'argument'

[/Users/ijeong-in/Git_repo/Java_Study/studyHalle]> java Hello
hello java study halle

실행할 바이트 코드를 지정할때는 확장자(.class)를 제외한 명칭만 기입하며, 대소문자를 구별하므로 정확히 기입해야 한다.

 

options

-classpath : 참조할 jar파일, zip파일, 클래스 파일의 경로를 지정할 수 있다.

-D : 시스템 프로퍼티 값을 설정할 수 있다. (ex) -Djava.library.path=./lib

-jar : jar파일로 압축되어 있는 자바 프로그램을 실행시킨다.

그 외 옵션들

https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html


바이트 코드란 무엇인가

바이트코드

: 소스 코드를 가상 머신이 이해할 수 있는 중간 코드로 컴파일 한 것

자바 바이트 코드

: 자바 소스 코드(.java)를 JVM이 이해할 수 있도록 컴파일한 중간 단계의 코드(.class)이며 JVM이 실행하는 명령어의 형태이다.

  • JVM은 바이트 코드를 OS에 특화된 네이티브 코드로 번역하여 실행한다.
  • 네이티브 코드로 번역할 때 JIT 컴파일러가 사용된다.
  • 파라미터를 제외한 각각의 바이트 코드는 1바이트로 구성되어 있다.
[/Users/ijeong-in/Git_repo/Java_Study/studyHalle]> javap -c Hello.class 
Compiled from "Hello.java"
public class Hello {
  public Hello();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String hello java study halle
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

JIT 컴파일러란 무엇이며 어떻게 동작하는가

JIT(just-in-time) 컴파일러 : 바이트 코드를 읽어 빠른 속도로 기계어를 생성해준다.

  • 자바 컴파일러가 소스 코드를 바이트 코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 자바 가상 머신이 바이트코드를 JIT 컴파일을 통해 네이티브 코드로 변환한다.

  • 코드가 실행되는 과정에 실시간으로 변환이 일어난다. (Just-In-Time)

  • 인터프리터의 실행 속도를 개선할 수 있다.

  • 동작 방식 : 같은 코드를 매번 해석하고 변환하는 것을 방지하기 위해 처음 실행될 때 인터프리터가 반복되는 코드를 발견한다면 JIT 컴파일러가 네이티브 코드로 저장한 뒤, 이후에는 인터프리터가 네이티브 코드를 바로 가져다가 쓸 수 있게 해준다.


JVM 구성요소

JVM Architecture Diagram

참조 : https://dzone.com/articles/jvm-architecture-explained

 

클래스 로더 시스템 : 자바 바이트 코드를 읽고 메모리에 저장한다.

  • 로딩 : 클래스 파일에서 바이트 코드를 읽어오는 과정
  • 링크 : 래퍼런스를 연결하는 과정
  • 초기화 : static 값 초기화 및 변수에 할당

메모리

  • 메소드 영역 : 클래스 수준의 정보(패키지 경로, 클래스 이름, 부모 클래스 이름, 메소드, 변수)를 저장하고 공유하는 영역이다.
  • 힙 영역 : 객체를 저장하고 공유하는 영역이다.
  • 스택 영역 : 쓰레드 마다 런타임 스택을 만들고 그 안에 스택 프레임(메소드 콜)이라는 블럭을 쌓는다. 쓰레드가 종료되면 런타임 스택도 사라진다.
  • PC(Program Counter) 레지스터 : 쓰레드 마다 현재 실행할 스택 프레임을 가리키는 포인터를 저장한다.
  • 네이티브 메소드 스택 : 네이티브 메소드를 호출할때 사용하는 별도의 메소드 스택 영역

실행 엔진

  • 인터프리터 : 바이트 코드를 한줄 씩 실행한다.
  • JIT 컴파일러 : 인터프리터가 반복되는 코드를 실행하는 비효율을 없애기 위하여, 반복되는 코드를 네이티브 코드로 바꿔준다.
  • GC(Garbage Collector) : 더 이상 참조되지 않는 객체를 모아서 정리한다.

JNI(Java Native Interface) : 자바 애플리케이션에서 C, C++, 어샘블리로 작성된 함수를 사용할 수 있는 방법 제공, native 키워드를 사용한 메소드를 호출한다.


JDK와 JRE의 차이

JRE (Java Runtime Environment)

: 자바 애플리케이션을 실행할 수 있도록 구성된 배포판.

  • JVM, 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일을 가지고 있다.
  • 개발 관련 도구는 포함하고 있지 않는다. (개발 도구는 JDK에서 제공된다.)
  • 오라클은 자바 11부터 JRE를 따로 제공하지 않는다. (JDK만 제공한다.)

JDK (Java Development Kit)

: JRE와 더불어 개발 관련 도구까지 함께 제공되는 배포판.

  • 소스 코드를 작성할 때 사용하는 자바 언어는 플랫폼에 독립적이다.

 

Comments