JVM의 구조와 Java의 실행방식을 설명해주세요.

     


    키워드

    • JVM란?
    • JVM의 역할 - 운영체제 상관없이 실행 가능, 효과적인 메모리 관리 가능
    • Java의 실행 방식 - 바이트 코드 / 클래스 로더 / Execution engine / Runtime Data Area 
    • JVM의 구조 - 5가지 영역 ( Class Loader, Execution engin, Runtime Date Area, JNI, Native Method Library )
    • Runtime Date Area - 5가지 영역 ( Method, Heap, Stack, Native Method Stack, PC register)

     


     

     

    JVM이란? + Java의 실행방식

     

    Java Virtual Machine JVM은 자바 가상 머신의 약자로 JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 자바 API와 함께 실행하는 것입니다. 메모리 관리(GC)을 수행하며 스택기반의 가상머신입니다. 자바 소스 코드는 기계어가 아니기 때문에 기계어로 번역해주는 작업이 필요합니다. 이것을 컴파일이라고 하며, .java 파일을. class 파일로 컴파일하게 되면 바이트 코드로 변환됩니다. 이때 각각의 컴퓨터에 설치된 JVM 프로그램에서 이 바이트 코드를 읽어 들이고, (== Class Loader를 통해 class를 파일을 JVM으로 로딩시킵니다) 그것을 기계어로 번역해주는 작업을 거치게 됩니다. (== 로딩된 class파일들은 Execution engine을 통해 해석됩니다) 해석된 바이트코드 (==클래스 파일)는 클래스 로더에 의해 Runtime Data Areas (==JVM메모리 영역)에 배치되어 실질적인 수행이 이루어집니다. JVM의 역할은 바이트 코드를 클래스 로더를 통해 읽어들이고 그것은 각각의 기계어로 변환하기 때문에 운영 체제에 상관없이 실행될 수 있습니다. 또한, 가비지 컬렉터로 메모리 관리를 자동으로 할 수 있어서 안정적인 프로그래밍을 할 수 있습니다.

     

     

    Java의 실행방식 요약이 필요하다면?

    더보기
    • 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어 자바 바이트코드(.class)로 변환시킵니다.
    • Class Loader를 통해 class 파일들을 JVM으로 로딩합니다.
    • 로딩된 class파일들은 Execution engine을 통해 해석됩니다.
    • 해석된 바이트코드는 Runtime Data Areas 에 배치되어 실질적인 수행이 이루어집니다.

     

     

    JVM의 구조

     

    JVM의 구조는 Class Loader, Execution engine, Runtime Data Area, 이렇게 3개는 위에서 간략하게 설명했고, C언어 관련된 영역이 2개가 있습니다. 바로 JNI와 Native Method Library입니다.  JNI는 C언어, C++로 작성된 함수를 사용할 수 있는 방법을 제공합니다. , 또한, Native Method Library는 C, C++로 작성된 라이브러리입니다.

     

    정리하자면 3개의 Java 관련, 2개의 C언어 관련이 있다고 생각하면 좋을 것 같습니다.

     

    이때, 런타임 데이터 에어리어는 5가지 영역으로 나누어져 있습니다. 메소드힙 영역모든 스레드가 공유하는 공간이고, 나머지 Stack, PC register, Native Method Stack쓰레드마다 하나씩 생성되는 공간입니다. 메소드 영역 jvm이 시작될 때 생성되는 공간으로 바이트 코드가 이 영역에 저장됩니다. 뿐만 아니라 모든 스레드가 공유하는 영역이기 때문에, 클래스와 변수의 정보 그리고 스태틱 키워드로 선언한 공유 변수가 저장됩니다. 힙 영역힙 영역에는 뉴 연산을 통하여 동적으로 생성된 인스턴스 변수가 저장됩니다. 뉴 연산을 통해서 생성된 데이터는 ( 예, 클래스의 객체 배열) 해당 객체가 소멸되기 전이나, GC 정리하기 전까지는 힙 영역에 남아있습니다. 그리고 힙 영역은 가비지 콜렉션에 대상이 되는 공간입니다. 효율적인 가비지 컬렉션을 수행하기 위해서 힙 영역은 더 세부적으로는 5가지 영역으로 나뉘게 됩니다.

     

    * 힙영역은 다음 포스팅에서 자세하게 다루겠습니다!

     

    스택 영역은 지역 변수나 메소드의 매개변수, 임시적으로 사용되는 변수, 메소드의 정보가 저장되는 영역입니다. 지역변수와 매개변수의 특성상 해당 메소드의 호출이 종류 되면 안에 선언된 변수들을 사라지게 됩니다. (주로 금방 사용되는 데이터가 저장되는 영역)

     

    pc 레지스터는 쓰레드가 어떤 부분을 어떤 명령어로 수행할지 저장하는 공간입니다. 스레드가 시작될 때 생성되며 현재 수행 중인 JVM의 명령어 주소를 저장하는 공간입니다

     

    네이티브메소드스택은 자바가 아닌 다른 언어로 작성된 코드를 위한 공간입니다 즉, C나 C++ 등의 코드를 수행하기 위한 공간이고, 자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역입니다.

     

     

     


    참고 자료

    더보기

    https://www.youtube.com/watch?v=AWXPnMDZ9I0

     

    21.7.11 수정됨

     

    728x90

    댓글