📚FOS Study
홈카테고리
홈카테고리

카테고리

  • AI 페이지로 이동
    • RAG 페이지로 이동
    • agents 페이지로 이동
    • BMAD Method — AI 에이전트로 애자일 개발하는 방법론
    • Claude Code의 Skill 시스템 - 개발자를 위한 AI 자동화의 새로운 차원
    • Claude Code 멀티 에이전트 — Teams
    • 멀티모달 LLM (Multimodal Large Language Model)
  • architecture 페이지로 이동
    • Cache-Aside 패턴
    • 디자인 패턴
    • 분산 트랜잭션
  • css 페이지로 이동
    • FlexBox 페이지로 이동
  • database 페이지로 이동
    • mysql 페이지로 이동
    • opensearch 페이지로 이동
    • redis 페이지로 이동
    • 김영한의-실전-데이터베이스-설계 페이지로 이동
    • 커넥션 풀 크기는 얼마나 조정해야할까?
    • 인덱스 - DB 성능 최적화의 핵심
    • 역정규화 (Denormalization)
    • 데이터 베이스 정규화
  • devops 페이지로 이동
    • docker 페이지로 이동
    • k8s 페이지로 이동
    • k8s-in-action 페이지로 이동
    • monitoring 페이지로 이동
  • go 페이지로 이동
    • Go 언어 기본 학습
  • http 페이지로 이동
    • HTTP Connection Pool
  • interview 페이지로 이동
    • 210812 페이지로 이동
    • 뱅크샐러드 AI Native Server Engineer
    • CJ 올리브영 지원 문항
    • CJ 올리브영 커머스플랫폼유닛 Back-End 개발 지원 자료
    • 마이리얼트립 - Platform Solutions실 회원주문개발 Product Engineer
    • NHN 서비스개발센터 AI서비스개발팀
    • nhn gameenvil console backend 직무 인터뷰 준비
    • 면접을 대비해봅시다
    • Tossplace Node.js Developer
    • 토스플레이스 Node.js 백엔드 컬처핏
  • java 페이지로 이동
    • jdbc 페이지로 이동
    • opentelemetry 페이지로 이동
    • spring 페이지로 이동
    • spring-batch 페이지로 이동
    • 더_자바_코드를_조작하는_다양한_방법 페이지로 이동
    • Java의 로깅 환경
    • MDC (Mapped Diagnostic Context)
    • OpenTelemetry 란 무엇인가?
    • Java StampedLock — 읽기 폭주에도 쓰기가 밀리지 않는 락
    • Virtual Thread와 Project Loom
  • javascript 페이지로 이동
    • Data_Structures_and_Algorithms 페이지로 이동
    • Heap 페이지로 이동
    • typescript 페이지로 이동
    • AbortController
    • Async Iterator와 제너레이터
    • CommonJS와 ECMAScript Modules
    • 제너레이터(Generator)
    • Http Client
    • Node.js
    • npm vs pnpm 선택기준은 무엇인가요?
    • `setImmediate()`
  • kafka 페이지로 이동
    • Kafka 기본
    • Kafka를 사용하여 **데이터 정합성**은 어떻게 유지해야 할까?
    • 메시지 전송 신뢰성
  • linux 페이지로 이동
    • fsync — 리눅스 파일 동기화 시스템 콜
    • tmux — Terminal Multiplexer
  • network 페이지로 이동
    • L2(스위치)와 L3(라우터)의 역할 차이
    • L4와 VIP(Virtual IP Address)
    • IP Subnet
  • react 페이지로 이동
    • JSX 페이지로 이동
    • VirtualDOM 페이지로 이동
    • v16 페이지로 이동
  • task 페이지로 이동
    • ai-service-team 페이지로 이동
    • nsc-slot 페이지로 이동
    • the-future-company 페이지로 이동
📚FOS Study

개발 학습 기록을 정리하는 블로그입니다.

바로가기

  • 홈
  • 카테고리

소셜

  • GitHub
  • Source Repository

© 2025 FOS Study. Built with Next.js & Tailwind CSS

목록으로 돌아가기
☕java/ 더_자바_코드를_조작하는_다양한_방법

JVM 구조

약 3분
2026년 1월 30일
2026년 3월 24일 수정
GitHub에서 보기

JVM 구조

JVM은 크게 4개 영역으로 구성된다: 클래스 로더 시스템, 메모리, 실행 엔진, 네이티브 인터페이스.


메모리 구조

스레드 공유 영역

메소드 영역 (Method Area)

  • 클래스 수준의 정보 저장: 클래스 이름, 부모 클래스 이름, 메소드, 변수
  • static 변수도 여기에 저장
  • MyApp.class.getSuperclass() — 메소드 영역에서 정보를 읽어옴
  • JVM 시작 시 생성, JVM 종료 시 소멸

힙 영역 (Heap)

  • new로 생성한 객체 인스턴스 저장
  • 클래스를 로딩하면 App.class 객체도 힙에 생성됨
  • GC의 대상이 되는 영역
  • 메모리 부족 시 OutOfMemoryError: Java heap space 발생

스레드별 독립 영역

스택 (Stack)

  • 메소드 호출마다 스택 프레임 생성 (지역 변수, 파라미터, 반환값, 연산 중간값)
  • 메소드 종료 시 프레임 제거
  • 재귀 호출이 깊어지면 StackOverflowError 발생

PC Register

  • 현재 실행 중인 JVM 명령어 주소를 저장하는 포인터
  • 스레드마다 독립적으로 존재

네이티브 메소드 스택

  • C/C++로 구현된 네이티브 메소드 실행 시 사용
  • Thread.currentThread() 같은 native 메소드가 이 스택을 사용

실행 엔진

인터프리터

바이트코드를 한 줄씩 읽어서 네이티브 코드로 해석하고 실행한다. 시작은 빠르지만 같은 코드를 반복 실행할 때 비효율적이다.

JIT 컴파일러 (Just-In-Time)

자주 실행되는 코드(Hot Code)를 감지해서 네이티브 코드로 미리 컴파일해둔다. 이후 해당 코드는 인터프리터를 거치지 않고 직접 실행되어 성능이 크게 향상된다.

처음 실행: 인터프리터로 실행 + 실행 횟수 카운팅
임계값 초과: JIT 컴파일 → 네이티브 코드 캐시에 저장
이후 실행: 캐시된 네이티브 코드 직접 실행

Garbage Collector

힙에서 더 이상 참조되지 않는 객체를 제거한다. GC 종류에 따라 성능 특성이 다르다.

GC 종류특징적합한 상황
Serial GC단일 스레드 처리소형 애플리케이션
Parallel GC멀티 스레드, 처리량 중심배치 처리
G1 GC힙을 Region으로 나눠 관리, STW 시간 예측 가능Java 9+ 기본값
ZGCSTW 1ms 이하 목표저지연 요구 서비스

Stop-The-World (STW): GC 실행 중 애플리케이션 스레드가 모두 멈추는 현상. GC 튜닝의 핵심 지표다.


자주 마주치는 메모리 에러

OutOfMemoryError: Java heap space
  → 힙 메모리 부족. -Xmx 설정 확인, 메모리 누수 점검

OutOfMemoryError: Metaspace
  → 클래스 메타데이터 영역 부족. 클래스 로더 누수(동적 클래스 생성 과다)

StackOverflowError
  → 재귀 호출 깊이 초과. 무한 재귀 또는 재귀 깊이 설정 문제

관련 도구

  • javap -c ClassName — 바이트코드 역어셈블
  • jmap -heap <pid> — 힙 사용량 확인
  • jstat -gcutil <pid> — GC 통계 모니터링
  • jstack <pid> — 스레드 덤프 (데드락 분석)
  • VisualVM, JProfiler — GUI 기반 힙/스레드 분석

관련 문서

  • 클래스 로더 시스템
java 카테고리의 다른 글 보기수정 제안하기

댓글

댓글을 불러오는 중...
목차
  • JVM 구조
  • 메모리 구조
  • 스레드 공유 영역
  • 스레드별 독립 영역
  • 실행 엔진
  • 인터프리터
  • JIT 컴파일러 (Just-In-Time)
  • Garbage Collector
  • 자주 마주치는 메모리 에러
  • 관련 도구
  • 관련 문서