ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA JVM(자바 가상머신)에 관하여
    Language/Java 2023. 2. 18. 16:39

    자바는 JVM(JAVA Virtual Machine) 위에서 동작한다. 이번 시간에는 JVM에 대한 정보를 공부해보도록 한다.

    JVM은 다음과 같은 특징을 가지고 있다.

    • JAVA와 OS 사이에서 중개자 역할
    • 메모리관리, Gabage Collection의 역할을 수행
    • ARM 아키텍쳐 같은 하드웨어는 레지스터 기반으로 동작하지만 JVM은 스택기반으로 동작

    jvm은 이러한 역할을 하고 있는데 애플리케이션 개발자가 사용할 때 몰라도 된다고 생각할 수 있다. 하지만 다음과 같은 이유로, 최소한의 동작원리는 이해하고 아는 것이 중요하다고 본다. 

     

    JVM을 알아야 하는 이유

    • 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위하여
    • 메모리를 효율적으로 사용하기 위해서(메모리 구조를 알아야 한다)

     

    JVM을 이해하기 위해서 우선 자바 프로그램의 실행과정에 대해서 알아보도록 하자.

     

    자바 프로그램 실행과정

    1. 프로그램이 실행될 때 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당 받는다. 이렇게 할당 받은 메모리를 용도에 따라 영역별로 관리한다. 
    2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다.
    3. Class Loader를 통해 이렇게 변환된 class파일들을 JVM으로 로딩한다.
    4. 해석된 바이트코드는(class파일) Runtime Data Area(JVM 메모리 영역)에 배치되어 실질적인 수행이 이루어진게 된

    이러한 실행과정에서 JVM은 필요에 따라 Thread Synchronization과 Gabage Collection같은 관리작업을 수행한다.

     

    자바 프로그램 실행과정에서 Class Loaderd와 Runtime Data Area영역이라는 새로운 용어가 나왔다. 이 역시 JVM을 이해하기 위해서는 반드시 알아야하는 부분이다. 다음으로 본격적으로 JVM 구조에 대해서 알아보도록 하자.

     

    JVM 구조

    우선 설명하기 전에 전체 그림을 보면 이해하기 좋다.

    Class Loader

    • 자바 컴파일러에 의해서 클래스파일로 변환된 파일들을 Runtime Data Area로 적재하는 역할

     

    Execution Engine

    • Class Loader에 의해 메모리에 적재된 바이트코드들을 기계어로 변경해 명령어 단위로 실행
    • 명령어를 하나 하나 실행하는 인터프리터(Interpreter)방식과 JIT(Just In Time)방식이 있다.다시 말하자면 인터프리터 방식은 한줄 한줄 해석하기 때문에 속도가 느리다는 단점을 가지고 있다. 그래서 JIT이라는 방식이 나온것인데 처음엔 인터프리터 방식으로 구동되다가 일정 기준이 넘어가면 JIT 컴파일 방식으로 명령어를 실행한다. 실행할 때 컴파일을 하면서 해당 코드를 캐싱하여 속도를 빠르게 한다.
    • JIT 컴파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식이다.

     

    Garbage Collector(줄여서 GC)

    • GC는 힙(heap) 메모리 영역에서 생성된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다. 정확히 어느 시점에서 역할을 하는 지는 알 수 없다.(참조가 없어지자마자 해제되는 것을 보장하지 않음)
    • 가장 중요한 특징은 GC가 수행되는 동안 GC를 수행하는 스레드가 아닌 다른 모든 스레드가 일시정지 된다는 것이다. 그렇기 때문에 Full GC가 일어나서 수 초간 모든 스레드가 정지된다면 아주 큰 장애로 이어질 수 있다. (Stop The World, STW라고도 한다)
    • GC에 대해서도 굉장히 긴 글이 되기 때문에 더 상세한 내용은 다음 포스팅에서 진행한다.

     

     

    Method Area

    • 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다.
    • 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보 같은 필드 정보와 메소드의 이름, 리턴타입, 파라미터, 접근 제어자 정보 같은 메소드 정보, type정보(인터페이스인지 클래스인지), Contant pool(문자 상수, 타입, 필드, 객체 참조가 저장), static 변수, final class 변수등이 생성되는 영역

     

    Heap Area

    • new 키워드로 생성된 객체와 배열이 생성되는 영역, GC가 일어나는 영역

     

    Stack Area

    • 지역 변수, 파라미터, 리턴 값 등이 생성되는 지역

     

    PC 레지스터

    • 스레드가 생성될 때마다 생성되는 지역이다. 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다(CPU 레지스터와 다름) 이것을 이용하여 스레드를 돌아가면서 수행할 수 있게 한다.

     

    Native Method Stack

    • 자바 외 언어로 작성된 네이티브 코드를 위한 영역이다.

     

    스레드가 생성되었을 때를 기준으로 Method Aread, Heap Area는 공유되고 나머지는 각 스레드마다 생성되어 공유되지 않는다. 다음 시간에는 GC가 진행이 되는 JVM의 Heap area에 대해서 상세히 알아보도록 하자.

     

     

     

    참고 및 출처

    https://asfirstalways.tistory.com/158

    https://jeong-pro.tistory.com/148

    https://s2choco.tistory.com/13

    https://www.guru99.com/java-virtual-machine-jvm.html

    'Language > Java' 카테고리의 다른 글

    Java Collection - Queue  (0) 2023.02.19
    자바 진법 변환(2진법 10진법 등)  (0) 2023.02.16
    [Java] 객체 복사에 대한 고찰  (0) 2022.04.15
Designed by Tistory.