본문 바로가기
Programming/Java

[whiteship 온라인 스터디] 1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

by 읽고 쓰는 개발자 2020. 12. 26.

github.com/whiteship/live-study/issues/1

 

1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. · Issue #1 · whiteship/live-study

목표 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기. 학습할 것 JVM이란 무엇인가 컴파일 하는 방법 실행하는 방법 바이트코드란 무엇인가 JIT 컴파일러란 무엇이며 어떻게 동작하는지 JV

github.com

목표

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

학습할 것

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

1. JVM이란 무엇인가

이미지 출처 :https://sunixi.com/introduction-to-java-virtual-machine-jvm/

JVM : 자바 가상 머신

운영체제는 자바 프로그램을 즉시 실행하는 것이 아니라, 컴파일러를 통해 바이트코드로 번역된 클래스 파일을 해석하여 실행한다.

다양한 운영체제에 맞는 기계어로 해석하여 실행해주는 가상의 운영체제가 JVM( Java Virtual Machine ) 이다.

따라서 개발자는 운영체제에 독립적으로 자바 프로그램을 개발할 수 있다.

바이트코드는 모든 JVM 환경에서 동일한 결과를 보장하지만, JVM은 운영체제에 종속적이기 때문에 각 환경에 맞게 설치되어야 한다.

Write once, run anywhere

 

2. 컴파일 하는 방법 & 3. 실행하는 방법

 

이미지 출처 : https://www.quora.com/What-is-the-difference-between-a-C++-and-a-Java-compiler

컴파일 & 실행하기 

// text 편집기에서 java 코드 작성 
Class TestHelloWorld {
	public static void main(String[] args) {
    	System.out.println("Hello World!");
    }
}
// .java 파일을 .class 파일로 컴파일한다. (javac 명령어)
javac TestHelloWorld.java

// 컴파일된 .class파일을 실행한다. (java 명령어. 자바 인터프리터)
java TestHelloWorld 


// Hello World! 가 출력된다 

+ IDE에서 손쉽게 컴파일 & 실행이 가능하다. 

+ javap : 역컴파일 명령어

 

4. 바이트코드란 무엇인가

바이트코드 명령어 리스트 : Java bytecode instruction listings

바이트코드 : 자바 코드를 컴파일하여 생성되는 코드. 자바 가상 머신이 이해할 수 있도록 번역된 코드.

 

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

JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.

출처 : ko.wikipedia.org/wiki/JIT_%EC%BB%B4%ED%8C%8C%EC%9D%BC

 

JIT 컴파일 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일

ko.wikipedia.org

6. JVM 구성 요소

이미지 출처 : https://sehun-kim.github.io/sehun/JVM/

클래스로더 시스템 

  • .class 에서 바이트코드를 읽고 메모리에 저장
  • 로딩 : 클래스에서 읽어오는 과정
  • 링크 : 레퍼런스를 연결하는 과정
  • 초기화 : static 값을 초기화 및 변수에 할당

메모리

  • 메소드 영역 : 클래스 수준의 정보 ( 클래스 이름, 부모 클래스 이름, 메소드, 변수) 저장. 공유 자원
  • 힙 영역 : 객체 저장. 공유 자원
  • 스택 영역 : 쓰레드 마다 런타임 스택을 생성. 그 안에 메소드 호출을 스택 프레임이라 부르는 블럭으로 쌓음. 쓰레드가 종료되면 런타임 스택도 사라짐
  • PC( Program Counter) 레지스터 : 쓰레드마다 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터가 생성
  • 네이티브 메소드 스택 : C, C++로 구현된 메소드 (구현된 interface API : JNI) 

출처 : 더 자바, 코드를 조작하는 다양한 방법 ( 백기선님 강의)

 

더 자바, 코드를 조작하는 다양한 방법 - 인프런

여러분이 사용하고 있는 많은 자바 라이브러리와 프레임워크가 "어떻게" 이런 기능을 제공할 지 궁금한적 있으신가요? 이번 강좌를 통해 자바가 제공하는 다양한 코드 또는 객체를 조작하는 방

www.inflearn.com

7. JDK와 JRE의 차이 

Java SE의 두가지 버전의 구현체. 

  • JRE( JAVA Runtime Environment )  자바 런타임 환경 : JVM + 표준 클래스 라이브러리 API (컴파일러 미포함). 프로그램 실행에 필요한 도구만 포함. 개발된 프로그램만 실행한다면 JRE 설치해도 된다.
  • JDK(JAVA Development Kit)  : JRE + 개발에 필요한 도구(라이브러리 API , 컴파일러 등)