Java/라이브스터디

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

목표

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

학습목표

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

 

 


 

 

JVM(Java Virtual Machine) : 자바 가상머신

가상머신 : 컴퓨팅 환경을 소프트웨어로 구현한 것.
자바가상머신 : 클래스 파일을 위한 소프트웨어적 컴퓨터

JVM의 기본 기능

  • Java 프로그램이 운영체제의 제약없이 실행
  • 프로그램 메모리를 관리 및 최적화
  • 바이트코드(.class 파일)를 OS특화 코드로 변환( 인터프리터와 JIT 컴파일러 사용 )

JVM의 스팩 :https://docs.oracle.com/javase/specs/jvms/se11/html/

클래스파일을 읽기위하여 거쳐지는 단계는 크게 3가지로 나뉩니다.

  1. 로딩 : 클래스파일 읽는 과정
  2. 링크 : 로딩된 값에서 참조관계를 연결하는 과정
  3. 초기화 : static 값을 초기화하고 변수에 할당하는 과정

 

(1) JVM의 메모리관리 :Galbage Collection

일단 메모리 구조를 알아보자!

다음과 같이 메모리는 크게 2분류로 나뉘며, 데이터 영역 안에서 3분류로 또 한번 나뉩니다.

  • Static 영역( = Method 영역 )
    • 컴파일 단계에서 확인할 수 있는 데이터 영역.
    • 클래스 이름, 메소드, 변수, 부모 클래스 이름 등등
  • Stack 영역
    • 메소드의 실행에 따라 생기는 변수 등이 쌓이는 영역
    • Thread마다 런타임 스택이 생기며, 그 안에는 메소드 호출 시 생성되는스택 프레임 블럭이 쌓인다.
  • Heap 영역
    • 객체가 생성되면 해당 객체의 정보들이 저장되는 영역
  • Program Counter
    • 스레드마다 현재 실행될 스택 프레임 영역을 가르킨다.
  • Native 메소드 스택
    • native 메소드를 사용하기 위해서JNI(Java Native Interface)를 호출하는 스택프레임이 쌓이는 영역
    • native method란, C 또는 C++로 구현된 메소드를 의미하며,Thread.currentThread()등이 존재한다.

Java 언어에서객체란 클래스의 멤버에 접근하기 위한 변수라고 볼 수 있으며, 해당 클래스의 생김새에 따라 생겨난 데이터들의 집합에 대한주소를 가르키는 변수입니다.

 

 

class Simple{
    public static void main(String[] args){
        int a = 10;
        Heap heap = new Heap();
    }
}

class Heap{
    public int b = 20;
}

이 코드를 이용하여 메모리에 어떻게 데이터가 기록되는지 살펴보았습니다.

 

 

 

static영역(= Method 영역)에 클래스내의 필드와 메소드가 기록됩니다.

 

 

 

 

Stack영역에는 메인 메소드에 대한 정보가 기록됩니다.

 

 

 

 

Heap영역에는 객체에 대한 생김새가 기록됩니다.

 

 

그래서 Galbage Collection이 뭔데??

JVM이 java 프로그램에서 사용되지 않는 메모리를 지속적으로 식별하고 제거하는 프로세스입니다. 

 

 

String str = "abc";
str = "cba";
String이 객체라는 사실을 인지해야 합니다.

 

객체라는 뜻은 Heap영역에서 관리된다는 것을 의미하고 결국 strabc라는 값을참조하는 변수입니다.

그런데 다음 줄을 만나게되면str이 참조하는 주소가 바뀌게되고 이전의 abc를 나타내던 주소값의 데이터는 더이상 쓸모가 없게됩니다.  

 

이때 쓸모없어진 abc를 처리하는 프로세스가 GC(Galbage Collection) 입니다.

 

 

(2) JVM의 기능수행

자바프로그램의 수행은 다음 과정을 통해 이루어집니다.

  1. 작성한 소스코드의 컴파일
  2. 생성된 바이트코드 ( .class 파일 )을 JVM을 통하여 실행

출처 : 관련 문서

 

Compilation and Execution of a Java Program - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

컴파일 방법

간단한 소스코드를 이용하여 컴파일 방법을 알아보자.

public class Main {
    public static void main(String[] args) {
        int a = 10;
        System.out.println(a);
    }
}
javac [파일명].java 

명령을 통하여 컴파일을 할 수 있습니다.

 

 

 

 

public class Main {
    public Main() {
    }

    public static void main(String[] var0) {
        byte var1 = 10;
        System.out.println(var1);
    }
}

위 명령을 통해 생성된 바이트코드를 디컴파일하면 다음과 같습니다.

  1. 기본 생성자를 자바 컴파일러가 만들어 주었다.
  2. int a대신byte var1로 변경된다.
바이트 코드 : JVM에서 동작하기 위한 언어로 운영체제에 상관없이 JVM이 알아볼 수 있습니다.

 

실행 방법

이제 생성된 클래스파일을 가지고 실행을 하기 위하여 다음 명령어를 사용하면 됩니다.

java [파일명]

 

클래스 로더는 뭘까?

JRE의 일부로써, 런타임중에 Java클래스를 JVM에 동적으로 로드해주는 역할을 맡고있으며 간단하게 클래스를 메모리에 로드해줍니다.

 

더보기

JRE : (Java Runtime Enviroment)

 

작성한 소스코드의 컴파일생성된 바이트코드 ( .class 파일 )을 JVM을 통하여 실행

런타임 환경(영어: runtime environment)은 컴퓨터가 실행되는 동안 프로세스나 프로그램을 위한 소프트웨어 서비스를 제공하는 가상 머신의 상태입니다.

런타임 환경의 예시로 쉽게 접할 수 있는 것은 OS(운영체제)가 존재합니다.
따라서 JRE는 자바 프로그램이 동작할 수 있도록 해주는 자바만의 운영체제라고 생각할 수 있습니다.

 

JDK는 JRE를 포함하고 있습니다.

 

 

JIT(Just-In-Time) 컴파일러

런타임에 플랫폼 중립 Java 바이트 코드를 원시 기계 코드로 컴파일하여 Java 애플리케이션의 성능을 향상시키는 OpenJ9 VM의 핵심 구성 요소

 

런타임에 인터프리터가 읽어들인 바이트코드에서 중복되는 부분을 캐싱해서 매번 새롭게 읽는 것을 방지하는 역할을 합니다.

 

 

JDK와 JRE의 차이

  • JRE ( Java Runtime Environment ) : 자바 실행 환경
    • 자바 애플리케이션을 실행할 수 있도록 구성된 배포판.
    • JVM 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 property 속성이나 리소스 파일을 가지고있음. ( JVM + 라이브러리 )
  • JDK ( Java Development Kit ) : 자바 개발 도구
    • JRE + 개발 툴
    • Oracle 자바 11버전 이후부터는 JDK만 제공.

 

 

참고자료