JVM 메모리 구조?

woonie·2022년 7월 2일
0

JVM이란?

JVM 메모리 구조를 보기전에 JVM이 무엇인지 알아야 한다.

JVM은 Java Virtual Machine의 약자로 자바 가상 머신이라고 한다. 자바와 OS(운영체제) 사이에서 중개자 역할을 수행하며 자바가 OS(운영체제)에 구애 받지 않고 프로그램을 실행할 수 있도록 도와준다. 또한 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작한다.

위의 이미지는 자바 프로그램의 실행 단계이다. 먼저 자바 컴파일러에 의해 자바 소스 파일은 바이트 코드로 변환된다. 이러한 바이트 코드를 JVM에서 읽어 들인 후 복잡한 과정을 거쳐 어떤 운영체제에서든 프로그램을 실행할 수 있도록 만든다.

만약, 자바 소스 파일은 리눅스에서 만들고 윈도우에서 해당 파일을 실행하고 싶다면 윈도우용 JVM을 설치만 해주면 된다.

JVM 메모리 구조

자바 프로그램의 실행 단계를 아주 간략하게 알아봤다. JVM이 정확히 어떻게 동작을 하고 구조가 어떤지 알아보자.

자바 프로그램의 실행 단계이다. JVM구조는 크게 이미지엔 나와있지 않지만 Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로 4가지로 나눌 수 있다.

자바 소스 파일은 자바 컴파일러에 의해 바이트 코드 형태인 클래스 파일이 된다. 이 클래스 파일은 클래스 로더가 읽어들이면서 JVM이 수행된다.

  1. Class Loader
    JVM내 클래스 파일을 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈이다. 런타임 시에 동적으로 클래스를 로드한다.

  2. Execution Engine
    클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어 실행한다. 최초 JVM이 나왔을 당시 인터프리터 방식으로 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 단점을 보완하였다. JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿔 실행이 빠르지만 변환하는데 비용이 발생했다. 이와 같은 이유로 JVM은 모든 코드를 JIT컴파일러 방식으로 실행하지 않고 인터프리터 방식을 사용하다 일정한 기준이 넘어가면 JIT컴파일러 방식으로 실행한다.

  3. Garbage Collector
    더 이상 참조하지 않는 힙 영역의 메모리를 정리한다.

  4. Runtime Data Area
    JVM의 메모리 영역으로 Method 영역과 Heap 영역은 모든 스레드에서 공유하며 Stack 영역과 Native Method Stack 영역 등은 스레드 별로 독립적인 메모리 공간을 갖는다.

    • Method 영역
      • 프로그램 실행 중 클래스가 사용되면 JVM은 해당 클래스 파일을 읽고 분석하여 클래스의 인스턴스 변수, 메소드 코드 등을 저장하며 클래스 변수도 함께 저장한다.
    • Heap 영역
      • 사용자가 관리하는 인스턴스가 생성되는 공간으로 객체를 동적으로 생성하면 인스턴스가 Heap 영역의 메모리에 할당되어 사용된다.
    • Stack영역
      • 프로그램 실행 중 발생하는 메서드 호출과 복귀에 대한 정보를 저장
    • Native Method Stack
      • 자바 이외의 C언어와 같은 언어가 필요한 경우 JNI기술을 통해 네이티브 메소드들이 바이트코드로 변환되면서 사용되고 기록되는 영역

간략하게 JVM 메모리 구조를 찾아봤다. 힙 영역은 또 몇 가지의 영역으로 나뉜다. 모든 내용을 다루기에 지금은 조금 무리가 있어 간략적으로 정리를 했고 추후 공부를 더 하고 각각의 영역에 대해서 깊게 알아봐야겠다.

참고
https://coding-factory.tistory.com/828
https://asfirstalways.tistory.com/158
https://cafe.naver.com/jjdev/227
https://jeong-pro.tistory.com/148
https://tape22.tistory.com/28

profile
동료들과 함께하는 개발의 중요성에 관심이 많습니다. 언제나 호기심을 갖고 꾸준히 노력하는 개발자로서 성장하고 있습니다.

0개의 댓글