[Java] - JVM

chancehee·2022년 11월 30일
0

자바

목록 보기
2/12
post-thumbnail

0. 글을 작성하는 이유

Java가 인기를 끄는 이유 중 하나는 JVM(자바 버추얼 머신)이 있기 때문입니다.
윈도우 사용자는 윈도우 운영체제를 사용하면서 대부분 아래의 이미지를 마주한 적이 있을겁니다.

대부분의 경우 업로드 및 다운로드를 하려한 경우, Java를 설치해야한다는 문구와 함께 설치를 요구합니다.
왜 설치를 해야할까요??
이는 JVM의 특징과 연관이 있습니다. 개발자가 어떤 응용프로그램을 만들었다면, 이 프로그램은 운영체제에 맞게 설계되지 않는다면 윈도우에서는 돌아가는데 맥에는 돌아가지 않는다.. 이런 골아픈 상황을 마주할 수 있습니다.
이때, Java를 사용하여 만들었다면 프로그램은 각각의 OS를 고려하지 않고 JVM 환경에서 동일하게 동작할 수 있는 장점이 있습니다.
자바의 창시자 '제임스 고슬링'은 이런말을 했습니다.

"Write once, run anywhere"

어떻게 이런 멋진 일(?)이 가능한지 알아보기 위해서 이 글을 작성해보겠습니다 :)

1. JVM(Java Virtual Machine)이란?

JVM은 자바 바이트코드를 OS(운영체제)에 맞게 해석 해주는 역할을 합니다.

Java 컴파일러는 .java 파일을 .class 라는 자바 바이트코드로 변환 시켜줍니다. 바이트코드는 기계어가 아니기 때문에 OS에서 바로 실행되지 않습니다.
이 때, JVM은 OS가 바이트코드를 이해할 수 있도록 해석해주는 역할을 합니다.

이를 통해서 OS에 종속적이지 않고, Java 파일 하나만 만들면 어느 디바이스든 JVM에서 실행 할 수 있게 되었습니다.

2. JVM 구성

  • (1) Class Loader
    RunTime 시점에 JVM 내로 클래스를 로딩하게 해주며 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드하게 됩니다.

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

  • (3) Garbage Collector
    GC는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 합니다.
    (GC에 관한 내용은 다룰 내용이 많기 때문에, 따로 포스팅 하도록 하겠습니다.)

  • (4) RunTime Data Area
    JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다.
    이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 나눌 수 있습니다.
    (a). Method Area( = class area = static area = data area)
    : 모든 쓰레드가 공유하는 메모리 영역입니다. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관합니다.
    (b). Heap Area
    : 모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역입니다. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역입니다.
    (c). Stack Area( = java stack = JVM stack)
    : 메서드 호출 시 마다 각각의 스택 프레임이 생성됩니다.
    프레임 내부에 메서드에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장합니다.
    메서드 수행이 끝나면 프레임별로 삭제됩니다.
    (d). PC Register
    : 쓰레드가 시작될 때 생성되며, 생성될 때 마다 생성되는 공간으로 쓰레드마다 하나씩 존재합니다.
    쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖습니다.
    (e). Native Method Stack
    : 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다.
    (일반적으로 C 스택을 사용합니다.)


Thread 공유 영역 vs Thread 개별 영역

3. 결론

JVM은 OS에 의존하지 않는 Java로 만들어진 애플리케이션을 실행시켜주는 역할을 합니다.
JVM은 크게 4가지 영역으로 구성 되어 있습니다.
Class loader, Excution Engine, GC, Runtime Data Area

0개의 댓글