[CS]JVM : Java Virtual Machine

김피자·2023년 2월 21일
0

CS

목록 보기
12/22

오늘은 JVM에 대해 파헤쳐보장😗
지난번 글에서 JVM과 Java의 동작원리에 대해 정리했는데 너무 짧기도하고 그것만 봐서는 이해가 잘 안가서 정리하게됐다.

https://velog.io/@posasac/Java2.-JVM%EA%B3%BC-Java-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC

JVM 용도와 정의

JVM에는 2가지의 기본 기능이 있다.

  1. 자바 프로그램이 어느 기기, 어느 운영체제에서도 실행될 수 있게 하는 것
    (한 번 작성해, 어디에서나 실행한다)
  2. 프로그램 메모리를 관리하고 최적화 하는 것

코드를 실행하고, 해당 코드에 대한 런타임 환경을 제공하는 프로그램에 대한 사양

즉, JVM은 자바 기반 애플리케이션을 클래스 로더를 통해 읽어들이고, 자바 API와 함께 실행하는 역할을 한다.

위의 사진처럼 Java 프로그램과 OS의 중간에서 중개자 역할을 하며 기기 및 OS의 제한없이 프로그램의 재사용성을 증대시킨다.

JVM 기본 구성

JVM 기반 프로그램이 실행되는 과정을 보기 전, 먼저 JVM을 구성하는 요소에 대해 다시 알아보자.

출처 : JVM이 뭐냐고 물으신다면

  1. JAVAC (Java Compiler)
    자바 소스코드(.java)를 바이트 코드로(.class)로 컴파일한다.

  2. Class Loader
    Javac에 의해 컴파일 된 바이트 코드 클래스를 로드하고 메모리 영역(Runtime Data Areas)에 배치한다.
    (동적 로딩 담당)

  3. Execution Engine
    클래스 로더에 의해 메모리 영역(Runtime Data Areas)에 적재된 바이트 코드들을 하나의 명령 단위로 읽어 기계어로 번역하고 수행한다.
    이 과정을 수행하는 방식에는 Interpreter방식과 JIT방식이 있다.
    두가지 방식에 대해서는 나중에 따로 정리를 해보겠습니다!

  4. Garvege Collector
    객체 생명주기 관리, Heap 메모리 영역에 생성된 객체들 중 유효한 참조가 없는 객체를 자동으로 탐색하고 제거

  5. Runtime Data Areas
    JVM이 OS 위에서 실행되며 적재된 프로그램이 요구하는 만큼 메모리를 할당받으면, 이 메모리를 그림처럼 5가지 영역으로 나누어 관리하게 된다.

  1. Method Area
    : JVM이 시작될 때 생성되고, JVM이 읽은 각각 클래스와 인터페이스에 대한 멤버변수(필드) 및 생성자를 포함한 메소드, static, final변수, 메소드의 바이트 코드 등을 보관하는 부분으로 한번 로드되면 메모리에 항상 상주하고 있기 때문에 모든 쓰레드가 공유 가능하다.
  2. Heap
    런타임 시 동적으로 할당되는 데이터가 저장되는 영역 (ex) new 등을 통해 생성한 객체나 배열 등) GC의 대상이기도 함
  3. PC Register
    현재 쓰레드가 다음으로 어떤 명령을 수행해야 하는지 기록하는 부분(JVM 명령의 주소를 가짐)

    Java Thread : 동작하고 있는 프로그램을 프로세스라고 하는데, 보통 한 개의 프로세스는 한 가지 일을 하지만, 쓰레드를 이용하면 한 프로세스 내에서 두 가지 또는 그 이상의 일을 동시에 할 수 있음

  4. JVM Stack
    지역변수, 메소드의 매개변수, 메소드 정보, 임시 데이터 등을 저장
  5. Native Method Stack
    자바 외의 다른 언어에서 작성된 네이티브 코드를 수행하기 위한 메모리 영역으로 컴파일되어 생성되는 바이트 코드를 해석해 실행하는 것이 아니라 당장 수행할 수 있는 기계어로 작성된 네이티브 프로그램을 실행시키는 영역이다.

JVM 실행 흐름

  1. JVM 기반 프로그램이 실행되면, JVM은 OS로부터 해당 프로그램이 요구하는 만큼 메모리를 할당받는다.
    JVM은 할당받은 메모리를 용도에 따라 여러 영역(Runtime Data Areas)으로 나누어 관리한다.

  2. Javac이 자바 소스코드를 읽고 이를 바이트 코드로 변환시킨다.
    (.java > .class)

  3. 변환된 바이트 코드 파일들을 클래스 로더를 통해 JVM 메모리 영역으로 로딩한다.

  4. 로딩된 바이트 코드 파일들은 Execution Engine을 통해 해석된다.

  5. 해석된 바이트 코드는 메모리 영역에 배치되어 동작 수행이 이루어진다.
    이 과정 속 JVM은 필요에 따라 쓰레드 동기화, GC같은 메모리 관리 작업을 수행한다.


JVM은 정말 어려운 것 같다.
그냥 자바 프로그램이 다른 기기나 운영체제에서도 실행될 수 있게 해주는 것이라고 생각하면 쉬운데 그 과정은 너무 어렵다
근데 또 계속 정리하다 보니깐 쉬운 것 같기도 하고
이렇게 여러번 정리하다보면 나도 JVM 이론의 고수가 될 수 있지 않을까요?!?!?


출처
https://velog.io/@haero_kim/JVM-%EC%9D%B4-%EB%AD%90%EB%83%90%EA%B3%A0-%EB%AC%BC%EC%9C%BC%EC%8B%A0%EB%8B%A4%EB%A9%B4

profile
제로부터시작하는코딩생활

0개의 댓글