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

yunu·2022년 4월 8일
0
post-thumbnail

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

목표

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

학습할 것

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

JVM이란 무엇인가

  • 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체
  • 운영체제 위에서 동작하는 프로세스로 자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시켜주는 역할
  • 코드를 실행하고 해당 코드에 대해 런타임 환경을 제공하는 소프트웨어 프로그램에 대한 사양(Specification)

JVM(Java Viertual machine) 주요 특징

  • 스택 기반의 가상 머신
  • 플랫폼의 독립성
  • 심볼릭 레퍼런스
  • 가비지 컬렉션

스택 기반의 가상 머신

  • 대표적인 컴퓨터 아키텍처들이 하드웨어가 레지스터 기반하는 동작하는 것이 아닌 스택 기반으로 동작
  • 가상 머신은 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것

플랫폼의 독립성

  • 전통적인 언어는 플랫폼에 따라 기본 자료형의 크기가 변한다. 하지만 JVM은 기본 자료형을 명확하게 정의하여 호환성을 유지하고 플랫폼 독립성을 보장
  • WORA(Write once Run Anywhere) "한 번 작성해, 어디에서나 실행한다"
  • JVM은 자바 바이트 코드를 운영체제에 맞게 해석해 주고 실행 → 초기에는 해석하는 과정을 거치기 때문에 네이티브 언어(c,c++..)에 비해 속도가 느렸지만 JIT(Just In Time)컴파일러를 구현해 이점 극복

심볼릭 레퍼런스

  • 기본 자료형(primitive data type)을 제외한 모든 타입(클래스와 인터페이스)을 명시적인 메모리 주소 기반의 레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참조
  • c, c++call by address가 아닌 call by reference로 참조를 통해 모든 타입을 가리키는 것을 의미하는 것 같음

가비지 컬렉션

  • 클래스 인스턴스는 사용자 코드에 의해 명시적으로 생성되고 가비지 컬렉션에 의해 자동으로 파괴
  • 프로그램 메모리를 관리하고 최적화

컴파일 하는 방법

콘솔창을 이용해 컴파일

// HelloJava.java
public class HelloJava {
    public static void main(String[] str) {
        System.out.println("Hello Java!");
    }
}

.java 파일이 있는 위치로 이동

> javac HelloJava.java
  • javac 자바 컴파일러로 HelloJava.java를 클래스 파일이자 바이트 코드인 HelloJava.Class로 변환

Java IDE(통합개발 환경)을 이용해서 컴파일

  • 이클립스(Eclipse) 또는 인텔리제이(IntelliJ) 이용해서 컴파일

실행하는 방법

콘솔창을 이용해 컴파일

.class 파일이 있는 위치로 이동

> java HelloJava
Hello Java!
  • javac로 인해 바이트 코드로 컴파일된 파일을 java 명령어로 실행

Java IDE(통합개발 환경)을 이용해서 실행

  • 이클립스(Eclipse) 또는 인텔리제이(IntelliJ) 이용해서 실행

바이트코드란 무엇인가

  • WORA를 구현하기 위해 JVM은 사용자 언어인 자바와 기계어 사이의 중간 언어로 자바 바이트코드를 사용
  • 자바 바이트코드는 자바 코드를 배포하는 가장 작은 단위
  • 자바 컴파일러가 자바 소스 코드를 JVM이 이해할 수 있는 자바 바이트 코드로 변환
  • .class 파일 형식

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

  • Just-In-Time 컴파일러
  • 프로그램이 실행 중인 런타임에 실제 기계어로 변환해 주는 컴파일러 -> 자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 바로 기계어로 변환
  • 동적 번역(Dynamic Translation)이라도도 불리며 이 기법은 프로그램의 실행 속도를 향상시킨기 위해 개발
  • 인터프리트 방식컴파일 방식을 혼합한 방식
  • 변환 작업은 인터프리터에 인해서 지속적으로 수행되지만 필요한 코드의 정보는 캐시에 담아두었다가 재사용 -> 같은 코드를 매번 해석하지 않고 실행할 때 컴파일하면서 코드를 캐싱, 사전에 정의된 임계치에서 시작하여 호출될 때마다 감소시키는 방식으로 자주 사용되는 메서드를 찾음
  • 인터프리트(Interpreter) 방식 : 프로그램을 실행할 때마다 컴퓨터가 알아들을 수 있는 언어로 변환하는 방식, 성능이 느림
  • 컴파일(Compile) 방식 : 실행하기 전에 컴퓨터가 알아들을 수 있는 언어로 변환하는 작업을 미리 실행하는 방식

JVM 구성 요소

  • JVM을 포함한 자바 프로그램의 전체적인 실행 과정
  • JVMClass Loader, Execution Engine, Garbage Collector, Runtime Data Area 크게 4가지로 구성
  1. Class Loader
    • 자바 컴파일러에 의해 생성된 클래스 파일(바이트 코드)들을 엮어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할
  2. Execution Engine
    • Class Loader에 의해 메모리에 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행하는 역할
    • 명령어를 하나하나 실행하는 인터프리터 방식이 있고 JIT 컴파일러를 이용하는 방식이 있음
  3. Garbage Collector
    • GC는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할
    • GC가 역할을 하는 시간을 정확히 언제인지 알 수 없음(참조가 없어지자마다 해제되는 것을 보장하지 않음)
    • Full GC가 일어나서 수 초간 모든 쓰레드가 정지한다면 장애로 이어지는 치명적인 문제가 생길 수 있음
  4. Runtime Data Area
    • JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
    • 아래 그림과 같이 나눌 수 있음

JDK와 JRE의 차이

  • JDK(Java Development Kit) : 자바 통합 개발 환경 = JRE + 개발 도구(javac, java compiler...)
  • JRE(Java Runtime Environment) : 자바 실행 환경 = JVM + 라이브러리 클래스 + 클래스 로더

출처 :
https://d2.naver.com/helloworld/1230
http://tcpschool.com/java/java_intro_programming
https://www.notion.so/Week1-f3ac173dfe724760927ea99721331fb6
https://www.notion.so/1-300a0dbecbf04122abb04af13f02d82d
https://blog.naver.com/frommydreamtomydream/222141454684
https://jeong-pro.tistory.com/148
https://wakestand.tistory.com/378

profile
rip

0개의 댓글