ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JVM이란 무엇이며 자바 코드는 어떻게 동작하는가
    Java 2021. 2. 27. 23:47

    목표

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

    학습할 것

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

    JVM이란 무엇인가

    JVM은 Java Vertual Machine을 줄임말로, 자바를 실행시키기 위한 가상의 컴퓨터라고 보시면 됩니다. 자바로 작성된 애플리케이션은 이 JVM에서 실행되므로, 자바 애플리케이션을 실행하기 위해서는 JVM이 반드시 필요합니다.

    자바 애플리케이션 VS 일반 애플리케이션
    자바 애플리케이션은 JVM을 통해 OS(운영체제)와 종속적입니다. 일반 애플리케이션과 비교했을 때 다른 OS에서 실행시키기 위해서는 애플리케이션을 해당 OS에 맞게 변경해야 하지만, 자바 애플리케이션은 JVM과 상호작용을 하기 때문에 다른 OS에서도 프로그램 수정 없이 실행이 가능합니다.

    단, JVM을 거치는 과정이 존해하고 하드웨어에 맞게 컴파일된 상태가 아니기 때문에 실행할 때 속도가 느리다는 단점도 가지고 있습니다. 하지만 바이트 코드를 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러와 향상된 최적화 기술을 통해 속도 격차가 많이 줄어들었습니다!

    컴파일 하는 방법

    자바 컴파일
    Java를 컴파일 하는 것은 Java로 작성된 코드를 JVM이 인식할 수 있는 자바 바이트 코드라는 것으로 바꾸는 것을 의미합니다.

    javac 명령어를 통해 자바 파일을 컴파일 할 수 있고, 컴파일된 파일은 .class 확장자를 가지게 됩니다.

    실행하는 방법

    자바 실행
    Java 프로그램을 실행하는 것은 JVM이 자바 바이트 코드를 읽어 컴퓨터에게 실행시키라고 명령을 내리는 것입니다.

    java 명령어를 통해 실행할 수 있습니다.

    바이트 코드란 무엇인가

    그렇다면 바이트 코드란 무엇일까요? 위키백과 정의에 의하면

    바이트코드는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.

    여기서 가상 컴퓨터는 JVM을 의미합니다. 자바에서의 바이트 코드는 컴파일된 파일(.class)이고, 이는 JVM이 해석할 수 있다는 것을 의미합니다.

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

    JIT 컴파일러에서 JIT는 Just-In-Time의 줄임말입니다. 이는 프로그램을 실행하는 시점에서 컴퓨터가 해석할 수 있는 기계어로 번역하는 컴파일 기법입니다.

    JIT 컴파일러는 바이트 코드를 읽어 빠른 속도로 기계어를 생성할 수 있습니다. 이런 기계어 변환은 코드가 실행되는 도중 실시간으로 진행되고, 전체 코드의 필요한 일부분만 진행됩니다. 또한 기계어로 변환된 코드는 캐시에 저장하기 때문에 재사용시 다시 컴파일할 필요가 없습니다.

    JVM 구성 요소

    JVM은 크게 이러한 구성 요소를 가지고 있습니다.

    JVM 구성 요소

    Class Loader

    JVM 내로 클래스 파일(.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 역할을 합니다.

    즉, 컴파일된 자바 클래스 파일을 메모리 영역(Runtime Data Area)에 적재하는 것입니다.

    Execute Engine

    클래스들을 실행하는 역할을 합니다. 클래스 로더가 JVM내의 런타임 데이터 영역에 배치시키면, 이것은 실행 엔진에 의해 실행되게 됩니다.

    실행 엔진은 InterpreterJIT 컴파일러의 두가지 방식을 사용하여 기계가 이해할 수 있게 작동합니다.

    Runtime Data Area

    JVM이 자바 바이트 코드를 해석하는 과정에서 사용하는 메모리 공간을 의미합니다.

    Runtime Data Area

    이 영역 중 PC, Java Stack, Native Method Stack은 스레드마다 각자 가지고 있는 개인 자원이고, HeapMethod Area는 모든 스레드가 공유하는 자원입니다.

    스레드별 자원
    먼저 스레드별로 각자 가지고 있는 자원에 대해 먼저 소개하도록 하겠습니다.

    PC Register는 실행할 자바 바이트 코드가 몇번째 줄인지 가르키는 역할을 합니다. 각 스레드가 돌아가면서 메서드를 실행하는데, 이때 어느 줄을 실행해야 할지 알려주는 역할입니다.

    Java Stack은 스레드 별로 1개만 존재하며, 메서드를 호출할 때 마다 Stack Frame을 생성합니다. 이런 Stack Frame은 메서드가 종료될 때 pop되어 사라집니다.
    Stack Frame은 데이터들을 local variable array, 자주 쓰일 수 있는 값들(대체로 상수)을 저장하는 Constant Pool, 메서드 내에서 데이터를 연산하기 위한 장소인 Operand Stack 등을 가지고 있습니다.

    Native Method Stack은 Java 코드가 아닌 다른 언어가 필요할 때 사용합니다. 이를 활용하여 C code를 통해 Kernel에 접근할 수 도 있습니다.

    스레드 공유 자원
    그럼 이제 스레드별로 공유하는 자원에 대해 알아볼까요?

    Heap은 인스턴스(객체)에 대한 정보를 저장하는 공간입니다. 이는 GC(Garbage collection) 대상에 포함됩니다.

    Method Area는 한번 로드 된 후 메모리에 항상 상주하고 있는 영역입니다. 예시로 Integer.parseInt('1')처럼 클래스의 메서드를 초기화 없이 사용가능한 것도 이 영역 덕분입니다.
    Method Area는 내부에 Runtime Constant Pool 영역을 가지고 있습니다. 이곳에는 클래스/인터페이스의 메서드, 필드, 문자열 상수 등의 레퍼런스가 저장되며, 이들의 물리적인 메모리 위치를 참조할 경우 사용됩니다.

    JDK와 JRE의 차이

    JRE는 Java Runtime Environment의 약자입니다.

    • 자바 프로그램을 동작할 때 필요한 라이브러리와 기타 파일들을 가지고 있습니다.

    JDK는 Java Development Kit의 약자입니다.

    • 자바 개발을 위해 필요한 도구(javac, java)을 포함합니다.
    • JDK를 설치하면 JRE도 같이 설치됩니다. (JDK = JRE + @)

    참고 링크


    백기선님 자바 스터디 1주차 과제 - 링크

    댓글

Designed by Tistory.