[개념 콕] JVM

내일배움캠프 수료생이 개발에 꼭 필요한 핵심 개념만 콕 집어 드립니다.
May 31, 2024
[개념 콕] JVM
✍🏼
개발을 시작하시는 여러분, 정보가 너무 많고 배워야 할 것도 산더미라 어디서부터 시작해야 할지 막막하신가요? 내일배움캠프 수료생들이 4개월 동안 배운 엄선된 핵심 개념을 직접 정리해서 알려 드립니다. 공부하다 막히거나 헷갈리는 개념이 있다면 개념 콕으로 정리해보세요.
 

JVM(Java Virtual Machine)

Java Virtual Machine (JVM)은 Java 프로그램을 실행하기 위한 가상 컴퓨터 환경입니다. JVM의 핵심 역할은 Java 프로그램이 운영체제(OS)에 구애받지 않고 독립적으로 실행될 수 있도록 하는 것입니다. Java 소스 코드(.java 파일)는 CPU가 직접 이해할 수 없는 고수준 언어로 작성되어 있기 때문에, 실행을 위해서는 기계어로 컴파일되어야 합니다. 그러나 Java는 OS에 종속되지 않기 위해 중간 단계로 JVM을 거칩니다. Java 컴파일러는 소스 코드를 JVM이 이해할 수 있는 바이트코드(.class 파일)로 변환합니다. 이 바이트코드는 JVM에 의해 해석되고 실행됩니다. JVM은 바이트코드를 해당 OS의 기계어로 번역하고 실행하는 역할을 담당합니다. 이러한 JVM의 중개자 역할 덕분에 Java 프로그램은 한 번 작성되면 어떤 운영체제에서도 별도의 수정 없이 실행될 수 있습니다. 이는 "Write Once, Run Anywhere" 라는 Java의 핵심 철학을 가능하게 해주는 JVM의 가장 큰 장점이라고 할 수 있습니다.
 
 

JVM의 주요 기능

1. 바이트코드 실행

Java 프로그램은 먼저 Java 컴파일러(javac)에 의해 바이트코드(.class 파일)로 컴파일됩니다. 이 바이트코드는 JVM이 이해할 수 있는 명령어 집합으로 변환됩니다.

2. 메모리 관리

JVM은 프로그램 실행 중 필요한 메모리를 관리합니다. 여기에는 힙(heap), 스택(stack), 메소드 영역(method area), 네이티브 메소드 스택 등이 포함됩니다.

3. 가비지 컬렉션

JVM은 사용되지 않는 객체를 자동으로 메모리에서 해제하는 가비지 컬렉션(Garbage Collection) 기능을 제공합니다. 이는 메모리 누수를 방지하고 메모리 효율성을 높입니다.

4. 플랫폼 독립성 = OS 독립성

JVM은 다양한 운영 체제와 하드웨어에서 동일하게 동작합니다. 한번 작성된 Java 프로그램은 어디서든 실행될 수 있다는 의미입니다.
 

JVM의 구조

1. 클래스 로더 시스템(Class Loader System)

상위 클래스 로더가 먼저 클래스를 로드하고, 필요한 경우에만 하위 클래스 로더가 클래스를 로드합니다.
  • Bootstrap Class Loader: JVM이 시작될 때 기본 클래스(JDK 클래스)를 JVM의 메모리로 로드합니다.
  • Extension Class Loader: 확장 클래스를 로드합니다.
  • Application Class Loader: 사용자 애플리케이션 클래스를 로드합니다.
 
확장 클래스 Java 표준 라이브러리의 기능을 확장하고, 추가적인 표준 API를 제공 하기 위해 JVM이 제공하는 기능을 위해 로드되는 클래스입니다. 이러한 클래스들은 주로 Java 확장 패키지에 속하며, 표준 Java 라이브러리 외에도 추가적인 기능을 제공합니다.
위치 : JVM 확장 디렉토리 (JAVA_HOME/lib/ext 또는 시스템 지정 디렉토리)
 
사용자 애플리케이션 클래스 사용자 애플리케이션 클래스는 사용자가 작성한 애플리케이션 코드를 포함하는 클래스입니다. 이 클래스들은 주로 애플리케이션의 비즈니스 로직을 담당하며, 개발자가 직접 작성하거나 외부 라이브러리로부터 가져온 클래스들을 포함합니다.
위치 : 애플리케이션의 클래스패스에 위치. 프로젝트 디렉토리 또는 외부 jar 파일
 

2. 실행 엔진(Execution Engine)

  • 인터프리터(Interpreter): 바이트코드를 하나씩 읽어 해석하고 실행합니다.
  • JIT 컴파일러(Just-In-Time Compiler): 자주 사용되는 바이트코드를 기계어로 변환하여 실행 성능을 향상시킵니다.
  • 가비지 컬렉터(Garbage Collector): 불필요한 객체를 메모리에서 해제합니다.
 
JIT 컴파일러(Just-In-Time Compiler) JIT 컴파일러는 JVM의 실행 엔진의 일부로, 프로그램이 실행되는 동안 바이트코드를 기계어로 컴파일한다. 이를 통해 인터프리터 방식보다 더 빠른 실행 속도를 얻을 수 있다. JIT 컴파일러(Just-In-Time Compiler)의 역할 동적 컴파일: 프로그램 실행 중에 자주 사용되는 메소드나 루프와 같은 바이트코드 조각을 기계어로 컴파일하여 성능을 향상시킨다 성능 최적화: 실행 중에 수집된 프로파일링 정보를 바탕으로 최적화된 기계어 코드를 생성한다 캐싱: 한번 컴파일된 기계어 코드는 캐시에 저장되어, 동일한 바이트코드가 다시 실행될 때 컴파일 과정을 생략하고 바로 실행할 수 있게 한다 JIT 컴파일러의 장점 성능 향상: JIT 컴파일러는 자주 실행되는 코드 블록을 기계어로 변환하여 실행 속도를 크게 향상시킨다 동적 최적화: 프로그램 실행 중 수집된 데이터를 바탕으로 최적화된 코드를 생성할 수 있어, 정적 컴파일러보다 효율적이다 메모리 효율성: 필요한 코드만 선택적으로 컴파일하므로 메모리를 효율적으로 사용할 수 있다
 

3. 메모리 영역(Memory Area)

  • 메소드 영역(Method Area): 클래스, 메소드 정보 등을 저장
  • 힙 영역(Heap Area): 객체가 생성되고 관리
  • 스택 영역(Stack Area): 각 스레드의 호출 스택이 저장
  • PC 레지스터(PC Register): 현재 실행 중인 명령의 주소를 저장
  • 네이티브 메소드 스택(Native Method Stack): 네이티브 메소드(C나 C++로 작성된 메소드)의 실행에 사용
 
 

JVM의 작동 방식

  • 클래스 로딩: JVM은 프로그램이 실행되면 필요한 클래스를 로딩한다. 클래스 로더는 클래스 파일을 찾고 메모리에 로드
  • 바이트코드 검증: 로드된 바이트코드는 JVM이 안전하게 실행할 수 있도록 검증
  • 실행: 실행 엔진이 바이트코드를 인터프리트하거나 JIT 컴파일러를 사용하여 기계어로 변환해 실행
  • 가비지 컬렉션: 실행 중 필요 없어진 객체를 가비지 컬렉터가 자동으로 해제
 
 

내일배움캠프는 개발에 필요한 핵심만 배웁니다

지금까지 꼭 필요한 개발 지식에 대해 알아보았습니다. 내일배움캠프에서는 전문가들이 선별한 핵심 개발 지식으로 개발 공부도, 취업도 보다 효율적으로 할 수 있는데요. 국내 유수의 IT기업 출신 튜터님들과 실습 위주의 독보적인 커리큘럼으로 개발자 취업을 체계적으로 준비해보세요. 내일배움캠프 4개월, 여러분 인생의 가장 큰 터닝 포인트입니다.
 
 
 
CREDIT
글 | 김민선 내일배움캠프 수료생 편집 | 정효재 팀스파르타 에디터
 
 

취업 준비, 어디서부터 시작해야 할지 모르겠다면?

 
🧐비전공자인데 IT 업계 취업할 수 있을까?
😟프로젝트 경험이 부족한데, 어떻게 준비해야 할까?
🥺IT 기업으로 이직하고 싶은데 뭐부터 시작해야 할까?
 
이런 고민을 하고 있다면, 내일배움캠프의 IT 취업 컨설팅을 받아보세요.
취업 코칭 전문가들이 여러분의 고민을 해결해 드립니다.
 
다음 링크에 이메일을 입력하시면 메일로 1:1 커리어 상담권과 취준 자료집을 보내드릴게요.
 
 
 
Share article
Subscribe to our newsletter

내일배움캠프 블로그