전체 글 560

[JVM 밑바닥까지 파헤치기] 7-2. 클래스 로딩 매커니즘: 클래스 로더

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 가상 머신 외부에서 다양한 방식으로 바이트 스트림을 로드하도록 하는 방법 1. 클래스 동치 조건같은 클래스 로더로 로딩되어야 동치 관계의 클래스라 판단함서로 다른 클래스 로더로 같은 .class를 로드하면 완전히 다른 타입으로 취급됨 2. 부모 위임 모델특징설명위임 순서상위 클래스 로더에게 먼저 위임, 실패하면 자기 자신이 로드 시도이점핵심 Java API 중복 로딩 방지, 보안성 향상접근 제한🔹 자식 → 부모 접근 가능🔹 부모 → 자식 접근 불가 3. 주요 클래스 로더 구조클래스 로더설명부트스트랩 클래스 로더JVM 내장JDK 기본 클래스 로딩 (JAVA_HOME/lib 또는 -Xbootclasspath)확장 클래스 로더lib/e..

Java 2024.12.23

[JVM 밑바닥까지 파헤치기] 7-1. 클래스 로딩 매커니즘: 클래스 로딩 처리 과정

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 0. 동적 로딩런타임에서 클래스가 필요할 때 클래스가 jvm에 동적으로 로드되는 방식런타임에 클래스 로딩 → 링킹 → 초기화가 순차적으로 수행됨 장점항목설명확장성필요할 때만 클래스를 로딩 → 모듈화 및 유연한 설계 가능유연성특정 클래스나 기능을 런타임 중에 교체/추가 가능외부 소스 로딩네트워크/파일시스템 등에서 외부 .class를 로드할 수 있음런타임 바인딩컴파일 타임이 아닌 실행 시 클래스 결정 가능 → 플러그인 구조에 유리 단점성능 떨어짐 1. Loading클래스의 바이트코드를 읽어와 JVM 메모리에 로드하는 단계바이트 스트림을 런타임 데이터 구조로 변환해 메서드 영역에 저장하고, Heap에 Class 객체 생성 특징항목설명클래스..

Java 2024.12.23

[JVM 밑바닥까지 파헤치기] 6-2. 클래스 파일 구조: 바이트코드 명령어

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 바이트코드 명령어명령어 크기: 1바이트 (256개 가능)타입 내장 (ex. iload-int, fload-float) 기본 명령어분류명령어/설명load지역 변수 → 피연산자 스택iload, aload, fload 등store피연산자 스택 → 지역 변수istore, astore, fstore 등 산술 명령어피연산자 스택의 값 두 개를 이용해 특정한 산술 연산을 수행결괏값을 다시 피연산자 스택의 맨 위에 저장타입명령어 예시설명정수 연산iadd, isub, imul, idiv, irem, ineg, iinc, iand, ior, ixor피연산자 스택에서 연산 수행 후 결과 다시 push비트 연산ishl, ishr, iushr 등비트 ..

Java 2024.12.22

[JVM 밑바닥까지 파헤치기] 6-1. 클래스 파일 구조: 클래스 파일

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 클래스 파일 (.class)하나의 클래스 또는 인터페이스를 정의바이트를 하나의 단위로 하는 이진 스트림 집합체 (빅 엔디언 방식)하위 호환성을 유지하며 확장 중 2. 구조항목설명매직 넘버클래스 파일인지 확인하는 용도 (항상 0xCAFEBABE로 시작)버전 번호마이너/메이저 버전 (JDK 버전 기준 증가)상수 풀 (Constant Pool)문자열, 숫자, 메서드/필드 참조 등 심벌 참조 + 리터럴 상수 저장소접근 플래그클래스/인터페이스의 접근 수준 (e.g., ACC_PUBLIC, ACC_FINAL)클래스 인덱스현재 클래스, 슈퍼클래스, 인터페이스 정의 (상수 풀 인덱스로 지정)필드 테이블클래스에 정의된 멤버 변수들의 정보 저장 ..

Java 2024.12.22

[JVM 밑바닥까지 파헤치기] 3-5. 가비지 컬렉터와 메모리 할당 전략: 저지연 가비지 컬렉터

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 성능 지표컬렉터는 최대 두개의 성능지표 달성이 가능함 지연 시간처리량메모리 사용량 2. 셰넌도어현재는 OpenJDK에서만 제공됨힙 크기와 상관없이 일시 정지를 10밀리초 이내에 묶어두는 것이 목표 동시 모으기사용자 스레드는 GC 스레드와 동시에 수행됨 연결 행렬리전 간 참조 관계 기록

Java 2024.12.21

[JVM 밑바닥까지 파헤치기] 3-4. 가비지 컬렉터와 메모리 할당 전략: 클래식 가비지 컬렉터

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 JDK 7 ~ JDK 11 내의 GC 기술고성능 / 저지연 컬렉터들과 구분됨 1. 구세대컬렉터특징 요약핵심 설명관련 매개변수Serial Old단일 스레드Mark-Compact가장 단순한 GC메모리 사용량은 적지만 멀티코어 환경에선 매우 느림테스트 환경 또는 작은 앱에서 사용-XX:+UseSerialGCCMS동시성 지원Mark-SweepPause time 적음 (GC 스레드와 사용자 스레드 병행)Full GC 때는 Stop-the-world메모리 단편화 발생-XX:+UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFraction-XX:+UseCMSCompactAtFullCollection-XX:CMSFul..

Java 2024.12.21

[JVM 밑바닥까지 파헤치기] 3-3. 가비지 컬렉터와 메모리 할당 전략: 구현

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 루트 노드 열거GC를 수행하려면 어떤 객체가 살아있는지 먼저 알아야 함이를 위해 GC Root라는 출발점을 기준으로 참조 그래프를 따라 탐색함대표적인 GC Root는 스레드 스택, 정적 변수, 레지스터가 있음항목설명Stop-the-world- 루트 노드 탐색은 실행 중인 애플리케이션과 충돌하므로 반드시 stop-the-world가 필요함OopMap (Object Offset Map)- 각 스레드 스택에 존재하는 객체 참조의 위치 정보를 담은 맵- 모든 시점이 아닌, Safe Point에서만 생성되어 성능 최적화됨객체 이동 지원- GC 과정에서 객체 주소가 바뀌는 경우, OopMap을 통해 스레드 스택 내 참조도 정확하게 갱신함-..

Java 2024.12.21

[JVM 밑바닥까지 파헤치기] 3-2. 가비지 컬렉터와 메모리 할당 전략: 가비지 컬렉션

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 세대 단위 컬렉션 이론대부분의 GC들의 근간 이론객체들을 나이에 따라 각기 다른 영역에 할당죽을 운명인 객체들을 한데 모음살아남을 객체를 나이가 있는 곳의 영역에 유지 가설가설 이름설명주요 전략 / 효과약한 세대 가설대부분 객체는 금방 사라진다- Young GC를 자주 실행- 빠른 회수로 공간 확보강한 세대 가설오래 살아남은 객체는 더 오래 생존할 가능성이 높다- 일정 생존 횟수 넘기면 Old 영역으로 승격- Old GC는 드물게 실행세대 간 참조 가설세대 간 참조는 드물고, 대부분은 같은 세대끼리 참조- Remembered Set 사용해 세대 간 참조만 추적- 구세대를 전체 스캔하지 않음 GC 종류GC 종류대상 영역발생 조건주..

Java 2024.12.21

[JVM 밑바닥까지 파헤치기] 3-1. 가비지 컬렉터와 메모리 할당 전략: 회수

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다1. 참조참조 타입정의 및 설명GC 수집 시점주요 용도Strong Reference코드에서 객체를 직접 가리킴❌ 참조가 있는 한 GC 대상 아님일반 객체 참조Soft Reference메모리 부족 시에만 수집되는 참조⚠️ 메모리 부족 시 GC 대상캐시Weak Reference강한 참조가 없으면 즉시 수집될 수 있음✅ GC 대상 (강한 참조 없을 경우 즉시)메모리 누수 방지임시 객체 관리Phantom Reference수집된 후에만 감지 가능한 참조. 객체 생명주기 끝을 추적할 때 사용✅ 객체 수집 후 ReferenceQueue에 등록정리/리소스 해제 후 처리 예시) Soft Reference더보기더보기SoftReference softRef..

Java 2024.12.19

[JVM 밑바닥까지 파헤치기] 2. 자바 메모리 영역과 메모리 오버플로

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 런타임 데이터 영역영역 이름설명주요 특징 및 구성 요소메서드 영역클래스 수준 메타데이터 저장- 클래스 버전, 필드, 메서드, 런타임 상수 풀 포함└ 런타임 상수 풀컴파일 시 생성된 상수 및 심볼 정보 저장- String.intern() 등이 사용됨힙 (Heap)객체 인스턴스가 저장되는 가장 큰 영역- GC 관리 대상- Young/Old 세대로 분할└ Young Generation새로운 객체가 생성되는 영역- Eden, Survivor 구역└ Old Generation장기 생존 객체 저장- Full GC 대상└ TLAB각 스레드 전용의 객체 할당 공간- 동시 할당 충돌 방지, 성능 향상 목적JVM 스택메서드 호출 시마다 생성되는 ..

Java 2024.12.19