본문 바로가기
우아한 코딩

JVM 이해하기

by 피크인사이트 2024. 2. 27.
반응형

오늘은 자바 프로그램 개발에 필수적인 기술인 JVM에 대해 알아보겠습니다.

JVM이란 Java Virtual Machine의 약자로, 자바 프로그램을 실행하는 환경을 제공합니다.

이번 글에서는 JVM의 개념부터 주요기능, 구조, 다양한 종류 및 활용 방안까지 다뤄보겠습니다.


 

JVM의 개념

JVM이란?

JVM(Java Virtual Machine)은 자바 프로그램을 실행하는 가상 컴퓨터입니다.

자바 소스를 컴파일하여 생성된 바이트(byte) 코드를 운영체제의 기계어로 변환하여 실행합니다.

JVM은 자바 프로그램의 메모리 관리와 스레드 관리 그리고 예외 처리 등을 담당하며, 플랫폼에 독립적이기 때문에 자바 프로그램은 한 번 작성하여 어떤 운영체제에서든 실행할 수 있도록 해주는 컴퓨터 안의 컴퓨터라고 생각할 수 있습니다.


JVM의 주요 기능

1. 자바 바이트코드 실행

자바 컴파일러는 자바 소스 코드를 JVM이 실행하도록 바이트코드로 변환합니다.

JVM은 이 바이트코드를 해석하고 실행하여 프로그램을 작동시킵니다.

 

자바 바이트코드(Java bytecode)"는 소스코드를 자바 컴파일러에 의해 생성된 중간 형식의 이진 파일이며, JVM에서 실행되는 명령어의 집합입니다.

자바 바이트코드는 JVM 머신이 이해할 수 있는 형식으로 작성되며, JVM은 이를 해당 운영체제의 기계어로 변환하여 실행합니다.

자바 바이트코드는 플랫폼에 독립적이며, 한 번 컴파일된 바이트코드는 어떤 운영체제에서도 실행될 수 있습니다.

이러한 특징으로 인해 자바는 "한 번 작성하고 어디서나 실행한다(Write Once, Run Anywhere)"는 슬로건으로 유명합니다.

 

자바 바이트코드는 .class 확장자를 가진 이진 파일 형식으로 저장되며, 자바 가상 머신에서 실행되기 위한 모든 정보를 포함합니다.

 

2. 운영체제 독립성

JVM은 운영체제에 독립적으로 작동하기 때문에, 자바 프로그램은 윈도우즈, 맥OS, 리눅스 등 여러 운영체제에서 실행될 수 있습니다.

 

3. 자동 메모리 관리

JVM은 가비지 컬렉션이라는 기능을 이용해 미사용 메모리를 자동으로 해제시켜 메모리 누수를 방지합니다.

 

4. 보안

 JVM은 자바 샌드박스라는 보안 모델을 사용하여 프로그램 실행을 제어하고 악성 코드로부터 시스템을 보호합니다.


JVM의 구조

<그림: HotSpot JVM 구조/ https://www.slideshare.net>

 

JVM은 크게 다음과 같은 구성 요소로 이루어져 있습니다.

1. 클래스 로더 (Class Loader)

클래스 로더는 JVM(Java Virtual Machine) 내부에서 클래스 파일을 로드하고, 해당 클래스를 JVM의 메모리에 링크하는 역할을 담당하는 주요 구성 요소입니다.

자바 애플리케이션 실행 시 클래스가 필요할 때 클래스 로더는 클래스를 동적으로 로드하여 JVM의 메모리에 올립니다.

이를 통해 애플리케이션 실행 중에 필요한 클래스들을 동적으로 로드하여 사용할 수 있게 되며, 자바의 동적 로딩(Dynamic Loading) 및 동적 링크(Dynamic Linking) 기능을 지원합니다.

2. 실행 엔진 (Execution Engine)

실행 엔진은 자바 바이트코드를 실제로 실행하는 핵심 역할을 수행합니다.

실행 엔진은 자바 바이트코드를 받아들여서 해당 플랫폼에 맞는 기계어로 번역하고, 이를 실행하는 역할을 합니다.

이러한 번역과 실행은 JVM의 핵심인 JIT(Just-In-Time) 라는 컴파일러를 통해 이루어집니다.

JIT 컴파일러는 프로그램 실행 중에 바이트코드를 네이티브 코드로 변환하여 처리 속도를 향상시키는 역할을 합니다.

실행 엔진은 또한 메모리 관리와 스레드 관리를 비롯하여 예외 처리, 동기화, 가비지 컬렉션 등의 다양한 JVM의 기능을 지원합니다.

 

3. 런타임 데이터(Runtime Data) 영역

런타임 데이터 영역 은 JVM(Java Virtual Machine)이 프로그램을 실행하는 동안 데이터를 보관하고 관리하는 메모리 영역입니다.

이 영역은 여러 부분으로 나뉘어져 있으며, 주요 구성 요소로는 힙 영역(Heap Area),  메서드 영역(Method Area), JVM 스택 영역(JVM Stack Area), PC 레지스터, 네이티브 메서드 스택 영역(Native Method Stack Area) 등이 있습니다.

 

4. 가비지 컬렉터 (Garbage Collector)

가비지 컬렉터는 프로그램에서 사용되지 않는 메모리 공간을 자동으로 식별하고 해제하는 JVM(Java Virtual Machine)의 구성 요소입니다.

자바에서는 메모리를 수동으로 할당하고 해제하는 것이 아니라, 동적으로 메모리를 할당하고 참조되지 않는 객체를 자동으로 해제하는 메모리 관리 방식을 사용합니다.

이를 위해 가비지 컬렉터가 주기적으로 실행됩니다.


JVM의 종류

JVM은 다양한 종류가 있으며, 각각의 특징이 가지고 있습니다.

1. HotSpot JVM

가장 널리 사용되는 JVM 구현체는 오라클(Oracle)에서 개발 및 유지보수하며, 성능 향상을 위해 동적인 코드 최적화 기능을 갖추고 있습니다.

또한 Just-In-Time(JIT) 컴파일러를 이용하여 바이트코드를 네이티브 코드로 변환합니다.

이 JVM은 대부분의 자바 개발자들에게 익숙하며, 자바 SE(Standard Edition)와 함께 제공됩니다.

2. OpenJ9

JVM 이클립스(Eclipse) 재단에서 개발한 JVM은 IBM에서 개발한 J9 VM을 기반으로 합니다.

이 JVM은 메모리 사용량이 적고, 가비지 컬렉션 성능이 우수하여 클라우드 환경에서 널리 사용됩니다. 또한 애플리케이션 시작 시간이 빠르고, 효율적인 스레드 관리를 지원합니다.

3. Zing JVM

Azul Systems에서 개발한 JVM은 대규모 및 실시간 애플리케이션에 최적화되어 있습니다.

이 JVM은 가비지 컬렉션 및 메모리 관리 기능이 탁월하며, 멀티코어 프로세서를 최대한 활용하여 성능을 극대화합니다.

특히 GC(Garbage Collection) 기능이 우수하여 메모리 릭 및 응답 시간을 줄이는 데 도움이 됩니다

4. GraalVM

오라클(Oracle)에서 개발한 GraalVM은 다양한 언어들을 하나의 런타임에서 실행할 수 있는 통합 환경이 제공됩니다.

이는 AOT(Ahead-Of-Time) 컴파일 및 JIT 컴파일러를 포함하여 빠른 시작 시간과 뛰어난 성능을 제공합니다.

또한 GraalVM은 자바 외에도 JavaScript, Python, Ruby 등의 다양한 언어를 지원하며, 다양한 언어 간 상호 운용성을 제공합니다.


JVM의 활용

JVM은 다음과 같이  자바 애플리케이션 개발 외에도 다양한 분야에서 활용됩니다.

1. 웹 개발

서블릿, JSP와 같은 웹 개발 기술은 JVM에서 실행됩니다.

대부분의 자바 웹 애플리케이션은 웹 서버에서 JVM을 실행하여 동작합니다.

2. 모바일 개발

안드로이드 애플리케이션은 대부분의 경우 JVM 기반의 Dalvik 또는 ART 런타임에서 실행됩니다.

안드로이드 개발자는 자바로 애플리케이션을 작성하고, 이를 APK 파일 형태로 패키징하여 안드로이드 기기에서 실행합니다.

3. 클라우드 컴퓨팅

클라우드 환경에서 자바 애플리케이션을 실행하기 위해 JVM이 사용됩니다.

대규모 웹 서비스나 기업용 애플리케이션은 클라우드 서비스를 통해 자바 애플리케이션을 배포하고 실행하는 경우가 많습니다.

4. 빅데이터 및 분석

하둡(Hadoop)과 같은 빅데이터 프레임워크나 스파크(Spark)와 같은 데이터 처리 도구는 대부분 자바로 개발되며, JVM에서 실행됩니다.

5. 게임 개발

몇몇 게임 개발 엔진은 자바를 기반으로 하고 있으며, 해당 게임들은 JVM에서 실행됩니다.


이처럼 JVM은 다양한 분야에서 널리 활용되며, 자바 애플리케이션을 실행하는 주요 플랫폼으로 사용되기 때문에, 안정적이고 효율적인 자바 프로그램 개발을 위해서는 JVM을 잘 이해하여야 합니다.

반응형