Today
-
Yesterday
-
Total
-

ABOUT ME

-

  • JAVA | JVM(Java Virtual Machine) 이란
    ▼ Backend/자바 (JAVA) 2021. 12. 10. 17:32
    반응형

     

    JVM(Java Virtual Machine)

    자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체다. CPU나 운영체제(플랫폼)의 종류와 무관하게 실행이 가능하다. 운영체제 위에서 동작하는 프로세스로 자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시켜주는 역할을 한다.

     

    1. .java  →  javac.exe  →  ByteCode

    Java Source Code로 작성된 .java 파일이 Java Complier(javac.exe)를 통해 ByteCode(.class)로 변환된다.

    바이트코드는 JVM(자바가상머신)이 이해할 수 있는 기계어이다.

     

    2. Class Loader

    class 파일을 JVM내로 로드하여 바이트코드를 해당 운영체제의 기계어에 맞게 변환되어 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재한다.

    3. Execution Engine

    Class Loader에 의해 Runtime Data Area에 적재된 ByteCode(.class)들을 기계어로 변경해 명령어 단위로 실행하는 역할을 한다. 최초 JVM이 나왔을 당시에는 인터프리터 방식이었기 때문에 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 이 점을 보완한다.

    하지만 JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 변경함으로써 실행이 빠르지만 역시 비용이 발생했다. 이 같은 이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행한다.

     

    *JIT 컴파일 (just-in-time compilation)

    전체 ByteCode를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식이다.

    4. Garbage Collector

    Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다. 이때, 시간은 언제인지 정확히 알 수 없다. 또 다른 특징은 GC를 수행하는 스레드를 제외한 다른 모든 스레드가 일시 정지된다.

    5. Runtime Data Area

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

    이 영역은 크게 5가지 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.

    (5-1) Method area 

    모든 스레드가 공유하는 메모리 영역이다. 메서드 영역은 클래스, 인터페이스, 메서드, 데이터 타입, 필드, Static, final class 변수 등의 바이트 코드를 보관한다.

    (5-2) Heap area

    모든 스레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역이다.  메서드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.

    (5-3) Stack area 

    메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성한다. 그리고 메서드 안에서 사용되는 값들을 저장하고 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다. 마지막으로 메서드 수행이 끝나면 프레임별로 삭제한다.

     

    클래스 Tistory t = new Tistory(); 이라는 소스를 작성했다면 Tistory t는 스택 영역에 생성되고 new로 생성된 Tistory 클래스의 인스턴스는 Heap area에 생성된다.

    (5-4) PC Register

    스레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 스레드마다 하나씩 존재한다. 스레드가 어떤 부분을 무슨 명령으로 실행해야 할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 갖는다.

    (5-5) Native method stack

    자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다. 보통 C/C++ 등의 코드를 수행하기 위한 스택이다. (JNI)

     

    모든 스레드 공유

    • Method Area
    • Heap Area 

    스레드마다 생성되지만 공유되지 않음

    • Stack Area
    • PC Register
    • Native method stack
    반응형

    댓글

Designed by Tistory.