ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] JVM이란? 자바 가성 머신 실행과정, 구조 알아보기
    프로그래밍 언어/JAVA 2022. 9. 19. 15:30

     

     

    기술 면접 준비를 하면서 JVM에 대해 알아보는 시간을 가졌다. 정리를 위해 포스팅을 해보려고 한다. 자바의 특징에 대해선 아래 포스팅에서 다뤘다.

     

    https://wonisdaily.tistory.com/4?category=1027232 

     

    [자바 기초] 자바(JAVA)란? ( + 특징 )

    자바는 썬 마이크로시스템즈에서 개발하여 1996년 1월에 공식적으로 발표한 객체지향 프로그래밍 언어이다. 자바의 가장 중요한 특징은 운영체제에 독립적이라는 것이다. 자라보 작성된 프로그

    wonisdaily.tistory.com

     

     

    JVM 자바가상머신이란?

     

    JVM은 'Java Virtual Machine'의 줄인 것으로 직역하면 '자바를 실행하기 위한 가상 기계'라고 할 수 있다. 즉) 자바를 실행하기 위한 가상 컴퓨터라고 이해하면 되겠다. JVM은 자바 코드를 컴파일 하여 .class 바이트 코드로 만들면 이 코드가 자바 가상 머신 환경에서 실행된다. 현재 사용하는 컴퓨터의 운영체제에 맞는 자바 실행환경 JRE가 설치되어 있다면 자바 가상 머신이 설치된다는 의미이다. 

     

     

     

     

    일반 애플리케이션의 코드는 OS만 거치고 하드웨어로 전달되는데 Java 애플리케이션은 JVM을 한 번 더 거치기 때문에 속도가 느리다는 단점을 가지고 있다. 

     

     

    JVM 실행과정

     

     

    자바의 경우 Java 언어로 작성된 Test.java는 컴파일하면 Test.class 파일이 생성된다. 그리고 이렇게 생성된 바이트 코드는 각자의 플랫폼에 설치되어 있는 자바 가상 머신이 운영체제에 맞는 실행 파일로 바꿔준다. 

     

    이렇게 Java는 컴파일된 바이트코드로 어떤 JVM에서도 동작시킬 수 있기 때문에 플랫폼에 의존적이지 않다. 

     

    JVM의 전체적인 흐름을 살펴보자면 아래와 같다.

     

    1. 자바 컴파일러(javac)가 자바 소스 코드(.java)를 컴파일 하면 바이트 코드(.class)가 생성된다. 바이트코드는 JVM에서 읽을 수 있는 코드이다.
    2. 바이트 코드를 Class Loader를 통해 JVM Runtime Data Area에 올린다. 즉) 메모리에 데이터를 저장/로딩한다.
    3. Runtime Data Area에 로딩 된 .class들은 Excution Engine을 통해 해석된다. 해석된 바이트 코드는 각 메모리 영역에 배치되어 수행하며 이 과정에서 GC 과정과 스레드 동기화가 이루어진다.

     

     

     

    JVM 구조 - 클래스 로더(class Loader)

     

    자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결된다. 이렇게 동적으로 클래스 로딩을 해주는 역할을 하는 것이 클래스 로더이다. 자바에서 소스를 작성하면 .java 파일이 생성되고 .java 소스를 컴파일러가 컴파일하면 .class 파일이 생성되는데 클래스 로더는 .class 파일을 묶어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재한다. 

     

     

    클래스 로더의 로드 과정은 다음과 같다.

    1) 로딩 : .class  클래스 파일을 JVM 메모리에 로드하는 과정이다. 변수나 메소드의 정보 등등
    2) 링크
    2 -1 ) 검증 : 바이트 코드가 제대로 자바의 규칙을 따르고 있는지 확인한다.
    2 -2 ) 준비 : 클래스가 필요로하는 메모리를 미리 할당하고, 클래스에서 정의된 필드, 메서드, 인터페이스를 나타내는 데이터 구조를 준비한다. 
    2 -3) 분석 : 클래스가 참조하는 객체에 대해 실제 메모리 값을 대입한다.
    3. 초기화 : 클래스 안에 static 변수가 있음 그 값을 할당하고 초기화하는 방식이다.  

     

     

    클래스 로더의 종류로 Bootstrap, Extension, System 클래스로더가 있다. 

     

     

     

     

    < 클래스 로더의 동작 방식 >

     

    클래스 로더는 새로운 클래스를 로드해야할 때 , 아래와 같은 방식으로 로드를 수행한다.

     

    - JVM의 메소드 영역에 클래스가 로드되어 있는지 확인한다. 만일 로드되어 있는 경우 해당 클래스를 사용한다.
    - 메소드 영역에 클래스가 로드되어 있지 않을 경우, 시스템 클래스 로더에 클래스 로드를 요청한다.
    - 시스템 클래스 로더는 확장 클래스 로더에 요청을 위임한다. 
    - 확장 클래스 로더는 부트스트랩 클래서 로더에 요청을 위임한다.
    - 부트스트랩 클래스 로더는 부트스트랩 Classpath(JDK/JRE/LIB)에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않은 경우 확장 클래스 로더에게 요청을 넘긴다.
    - 확장 클래스 로더는 확인 후 존재하지 않으면 시스템클래스 로더에게 요청을 넘긴다.
    - 시스템 클래스 로더는 시스템 classpath에 해당 클래스가 있는지 확인하고 존재하지 않은 경우 classNotFoundException을 발생시킨다. 

     

     

    <클래스 로더가 지킬 원칙>

     

    1. 위임 원칙 : 클래스 로더는 클래스 또는 리소스를 찾기 위해 요청 받았을 때, 상위 클래스 로더에게 책임을 위임하는 위임 모델을 따른다. 

     

    2. 가시 범위 원칙 : 하위 클래스 로더는 상위 클래스 로더가 로드한 클래스를 볼 수 있지만, 반대로 상위 클래스 로더는 하위 클래스 로더가 로드한 클래스를 알 수 없다.

     

    3. 유일성의 원칙 : 하위 클래스 로더가 상위 클래스 로더에게 로드한 클래스를 다시 로드하지 않아야 한다는 원칙이다. 위윔 원칙에 의해 위쪽으로 책임을 위임하기 때문에 고유한 클래스를 보장할 수 있다. 

     

     

     

     

    JVM 구조 - 실행 엔진 (Execution Engine)

     

    클래스 로더에 의해 JVM으로 로드된 .class 파일들은 Runtime Data Areas의 Method Area에 배치되는데, 배치된 이후 JVM은 Method Area의 바이트 코드를 실행 엔진에 제공하여, 정의된 내용대로 바이트 코드를 실행시킨다. 이때, 로드된 바이트 코드를 실행하는 런타임 모듈이 실행 에닌이다. 실행 엔진은 바이트코드를 명령어 단위로 읽어서 실행한다. 

     

     

    JVM 구조 - 런타임 데이터 영역 (Runtime Data Area)

     

     

    런타임 데이터 영역은 JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다. 

     

    모든 스레드가 공유해서 사용하며 GC의 대상인 힙역역과 메서드 영역이있고, 스래드마다 하나씩 생성되는 스택, PC 레지스터, 이티브 메서드 스택이 있다. 

     

     

    메서드영역

    : 클래스 멤버 변수 이름, 데이터 타입, 접근 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static 변수, final class 등이 생성되는 영역이다. 

     

    힙 영역

    : new 키워드로 생성된 객체와 배열이 생성되는 영역으로 주기적으로 GC가 제거하는 영역이다. 

     

    스택 영역

    : 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역이다. 

     

    PC 레지스터 

    : Thread가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 즉 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.

     

    네이티브 메서드 스택

    : 자바 이외의 언어 ( C, C++ 등) 로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역으로 일반적인 C 스택을 사용한다.  

     

     

     

     

     

     

     

     

     

     

     

     

    참고 : https://coding-factory.tistory.com/828 

    https://steady-coding.tistory.com/593

    반응형

    댓글

Designed by Tistory.