728x90
반응형

JVM은 자바(Java)의 핵심이라 해도 과언이 아닙니다.
우리가 작성한 자바 코드가 어떻게 실행되는지,
플랫폼 독립성이 어떻게 보장되는지,
모든 답은 JVM에 있습니다.

이 글에서는 JVM이 무엇인지, 내부 구성 요소는 무엇이며,
왜 Java가 JVM 덕분에 강력한 언어인지 쉽게 정리해드립니다.

☕ JVM이란?

JVM (Java Virtual Machine) = 자바 가상 머신

자바 프로그램을 실행하는 엔진이자,
"한 번 작성하면 어디서나 실행된다 (Write Once, Run Anywhere)"라는 자바 철학을 실현해주는 핵심 기술입니다.


🔧 무슨 일을 할까?

JVM의 핵심 역할은 딱 하나:

컴파일된 .class 바이트코드 파일을 실행하는 것

즉, 우리가 작성한 .java 소스 코드는 **JDK의 컴파일러(javac)**에 의해 .class라는 바이트코드로 바뀌고,
이 바이트코드를 운영체제에 맞게 해석해서 실행하는 주체가 바로 JVM입니다.


🔍 JVM 내부 동작 구조 요약

[.class 파일]
      ↓
 Class Loader → 메모리에 로딩
      ↓
 Bytecode Verifier → 유효성 검사
      ↓
 Execution Engine → 실행 (JIT 컴파일 포함)
      ↓
 Native Code → 실제 OS에서 동작

📦 구성 요소 간단 설명

구성 요소역할
Class Loader 클래스 파일 메모리에 로드
Execution Engine 바이트코드 해석 & 실행
JIT Compiler 바이트코드를 네이티브 코드로 동적 변환
GC (Garbage Collector) 불필요한 객체 메모리 자동 정리
Runtime Data Area 메모리 공간 (Heap, Stack 등)
 

🤔 JVM이 왜 중요한가요?

  • 플랫폼 독립성: 같은 자바 프로그램이 Windows, Linux, macOS에서 실행 가능
  • 메모리 관리 자동화: GC 덕분에 개발자가 직접 메모리 해제할 필요 없음
  • 보안성: 바이트코드 검사 및 제한된 실행 환경 제공

📌 용어 간 관계 정리

용어설명
JDK 자바 개발 도구 세트 (JRE + 컴파일러 포함)
JRE 실행 환경 (JVM + 라이브러리)
JVM 실제 실행기 (JRE 내부에 있음)

 

728x90
반응형
728x90
반응형

✅ 한눈에 보는 차이표

구성 요소설명포함 관계주요 역할
JDK (Java Development Kit) 자바 개발 도구 전체 세트 JDK ⊃ JRE ⊃ JVM 개발 + 실행
JRE (Java Runtime Environment) 자바 실행 환경 JRE ⊃ JVM 실행만 가능
JVM (Java Virtual Machine) 자바 가상 머신 (실행 엔진) JRE ⊃ JVM 바이트코드 실행
 

🔍 1. JVM (Java Virtual Machine)

“Write once, run anywhere”를 실현시키는 핵심”

  • 역할: .class 파일(바이트코드)을 실행
  • 동작:
    1. Class Loader: 클래스를 메모리에 로딩
    2. Bytecode Verifier: 코드 검증
    3. Execution Engine: 코드 실행 (JIT 컴파일 포함)
  • OS/환경별로 다름: 각 OS에 맞는 JVM이 존재

🔸 JVM만으로는 자바 코드 작성 불가


🔍 2. JRE (Java Runtime Environment)

“자바 프로그램을 실행할 수 있는 환경”

  • 구성:
    • JVM
    • 자바 클래스 라이브러리(rt.jar)
    • 필요한 기타 실행파일 (예: java 명령어)
  • 목적: 자바 프로그램 실행만 가능 (컴파일 ×)
  • 대상: 자바 개발이 아닌 실행만 필요한 사용자 (예: 서버 운영자)

🔸 개발 도구 없음 (javac X)


🔍 3. JDK (Java Development Kit)

“자바를 개발하기 위한 모든 도구 포함”

  • 구성:
    • JRE
    • 개발 툴 (javac, javadoc, jar 등)
  • 역할: 자바 소스 코드를 작성, 컴파일, 디버깅 가능
  • 대상: 자바 개발자

🔸 JDK 설치하면 JRE, JVM 포함

[JDK]
 └── [JRE]
       └── [JVM]

🧠 쉽게 외우는 포인트

외우는 방법
JVM은 바이트코드를 실행하는 엔진
JRE는 JVM + 실행 라이브러리 = 실행 환경
JDK는 JRE + 개발 도구 = 개발 키트
 

🎯 개발자 입장에서 요약

  • 자바 코드 작성 ➡️ JDK 필수
  • 자바 앱 실행만 ➡️ JRE만 설치해도 가능
  • 바이트코드 실행 책임자 ➡️ JVM

 

728x90
반응형
728x90
반응형

자바 개발자라면 꼭 알고 있어야 하는 GC(Garbage Collector)!
객체는 언제 메모리에서 사라지고, 애플리케이션이 왜 가끔씩 멈추는지 궁금하셨나요?
아래 이미지와 함께 GC의 작동 구조를 쉽게 설명해드립니다.


🔍 GC 개념 요약

**Garbage Collector(GC)**는 사용하지 않는 객체를 힙 메모리에서 자동으로 제거하는 JVM의 기능입니다.
메모리 누수를 방지하고 개발자가 직접 메모리를 관리하지 않아도 되게 해주는 아주 고마운 기능이죠.


🧠 Java 힙 메모리 구조

아래 이미지는 자바 힙(Heap) 메모리의 구성과 객체 이동 과정을 시각적으로 표현한 구조입니다.

✅ 설명:

  • 객체는 먼저 Eden 영역에 생성됩니다.
  • GC(Minor GC)가 발생하면 Eden → Survivor1 → Survivor2를 오가며 살아남습니다.
  • 여러 번 살아남으면 Old 영역으로 이동합니다.
  • Old가 꽉 차면 **Major GC (또는 Full GC)**가 발생합니다.
  • Permanent(또는 Java 8 이후 MetaSpace)는 클래스 정보 등 JVM 메타데이터를 저장하는 공간입니다.

💥 GC의 종류

GC 종류대상 영역특징
🧹 Minor GC Young Generation (Eden + Survivor) 빠르고 자주 발생함
🧹 Major GC Old Generation 느리고 멈춤(STW)이 발생함
🧹 Full GC 전체 힙 영역 Major GC 포함 + 기타 리소스 정리
 

🛑 STW(Stop The World)란?

GC를 수행하는 동안 JVM의 모든 스레드가 멈추는 현상입니다.
특히 Major GC나 Full GC 시 STW가 발생하며 사용자 체감 지연이 생길 수 있습니다.

📌 GC 튜닝의 핵심: STW 시간을 최소화하는 것!


⚙ 대표적인 GC 알고리즘

GC 종류특징적합 환경
Serial GC 단일 스레드, 기본 구조 저사양/테스트용
Parallel GC 멀티스레드 병렬 처리 일반 서버, 병렬 CPU
Parallel Old GC Old까지 병렬 처리 고사양 서버
G1 GC Region 단위 처리, STW 최소화 Java 9 이상 대규모 앱
ZGC/Shenandoah 실시간 GC, STW 거의 없음 실시간 처리 시스템
 

🧰 개발 팁 요약

  • 객체는 가능한 빨리 Eden에서 제거되도록 설계하자
  • Old로 가는 객체는 재사용하거나 Pool 처리가 바람직
  • GC 튜닝 시에는 G1 GC, ZGC 등 최신 GC 전략 고려

✅ 마무리

GC는 Java의 강력한 장점 중 하나지만,
그 내부 동작을 모르면 애플리케이션 지연이나 STW 문제를 겪기 쉽습니다.
이제 GC 동작 구조를 알았으니, 메모리 튜닝과 성능 최적화에 자신감이 붙으실 겁니다!

728x90
반응형
728x90
반응형

📌 목차

  1. 프로그램이란?
  2. 프로세스란?
  3. 스레드란?
  4. 자바 스레드의 개념
  5. 스레드 사용 시 주의사항

1. 프로그램 (Program)

  • 사전적 의미: 어떤 작업을 위해 실행 가능한 파일
  • .exe, .jar, .py 등 사용자가 실행시킬 수 있는 상태
  • 아직 메모리에 올라가지 않은 정적인 상태

2. 프로세스 (Process)

메모리에 적재되어 실행되고 있는 프로그램의 인스턴스

✅ 정의

  • 운영체제로부터 CPU 시간, 메모리 등 시스템 자원을 할당받은 실행 단위
  • 하나의 독립된 개체로서 **자신만의 주소 공간과 메모리 구조(Code/Data/Stack/Heap)**를 가짐

✅ 주요 특징

  • 프로세스는 독립된 주소 공간을 사용
  • 기본적으로 프로세스마다 1개 이상의 스레드 포함
  • 다른 프로세스와 자원 공유 ❌ (단, IPC(Inter-Process Communication) 이용 가능)
🧱 프로세스 메모리 구조
┌────────┐
│  Code  │ ← 실행 코드
│  Data  │ ← 정적 변수
│  Heap  │ ← 동적 할당 객체
│  Stack │ ← 함수 호출/지역변수 (스레드별)
└────────┘

 


3. 스레드 (Thread)

프로세스 내부에서 실행되는 흐름의 최소 단위

✅ 정의

  • 하나의 프로세스 내에서 여러 작업을 동시에 처리할 수 있는 실행 흐름
  • 프로세스의 **자원(Code/Data/Heap)**을 공유하지만,
    스택(Stack)과 레지스터는 스레드별로 독립적

✅ 주요 특징

  • 스레드는 **경량 프로세스(Lightweight Process)**라고 불림
  • 같은 프로세스 내 스레드 간에는 메모리 공유 → 속도 빠름, 통신 쉬움
  • 메모리 공유로 인한 경합 조건(race condition) 발생 가능성 있음
 
📌 스레드는 같은 Heap 공유
⟶ 스택은 독립, 힙은 공유

 


4. 자바 스레드 (Java Thread)

✅ 자바 스레드 개요

  • JVM이 운영체제처럼 스레드를 관리
  • 자바는 프로세스 개념 없음, 오직 스레드만 있음
  • JVM 내부에서 스레드는 다음을 관리:
    • 총 스레드 수
    • 각 스레드의 메모리 주소
    • 스레드 상태 (NEW, RUNNABLE, BLOCKED 등)
    • 우선순위

✅ 자바 스레드의 실행 흐름 예시

public class MyThread extends Thread {
    public void run() {
        System.out.println("스레드 실행 중!");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t = new MyThread();
        t.start(); // JVM에 실행 요청
    }
}

5. 스레드 사용 시 주의사항

⚠️ 동기화 문제(Synchronization)

  • 멀티 스레드 환경에서는 같은 자원에 동시 접근하면 충돌 가능
  • 이를 방지하기 위해 동기화(synchronized) 키워드 사용
  • 예시:
synchronized void increaseCounter() {
    counter++;
}
728x90
반응형

+ Recent posts