Java/JVM 22

[JVM 밑바닥까지 파헤치기] 7-3. 클래스 로딩 매커니즘: 자바 모듈 시스템

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다1. JPMSJava 9에서 도입된 모듈 시스템⚠️ 기존의 Java는 JAR 단위의 클래스패스 기반 구조는 의존성/캡슐화가 느슨하였음✅ 모듈 단위의 캡슐화, 격리, 의존성 명시 시스템이 도입됨➡️ 실행 시점에 의존성/가시성을 검증한 후 실행함 클래스패스 문제점) 순환 참조더보기순환 참조를 감지/차단하지 못함⚠️ 프로젝트가 커질수록 스파게티 의존성이 되기 쉬움❌ 초기화 순서 문제 (ClassCircularityError)❌ 결합도 높아짐 클래스패스 문제점) 런타임 오류더보기컴파일 타임에 존재했던 의존성이, 런타임 배포시에 빠지면 런타임 에러가 터짐❌ ClassNotFoundException / NoClassDefFoundError (클래..

Java/JVM 2024.12.23

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 클래스 동치 조건같은 FQCN + 클래스 로더로 로딩되어야 동일한 타입임✅ 서로 다른 클래스 로더로 같은 .class를 로드하면 완전히 다른 타입으로 취급됨➡️ 충돌 방지를 위한 모듈 격리를 위해 설계됨 예시) WAS더보기ex) 각 서버의 웹앱이 쓰는 라이브러리 종류가 같을 경우클래스의 FQCN은 같으나, 버전은 다를 수 있음⚠️ 만약 클래스로더 격리가 없다면, JVM에 클래스는 하나만 올라올 수 있어서 먼저 로드된 버전만 사용될 수 있음✅ 웹앱별로 격리하여 서로 다른 버전을 동시에 사용할 수 있음 2. 클래스 로더.class 바이트코드를 읽어 메모리에 올리는 주체✅ 직접 정의 가능 코드) Application ClassLoad..

Java/JVM 2024.12.23

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 클래스 동적 로딩JVM 프로그램 실행 도중, 해당 클래스가 처음 필요해지는 시점에 클래스를 메모리에 로드하는 방식✅ Lazy Loading 기반 장점항목설명특징확장성새로운 기능을 기존 코드 수정 없이 추가 가능- 모듈 단위 설계 가능- 의존성 분리 가능유연성런타임 중에 기능을 교체/추가 가능ex) OSGi, WAS, 핫스왑 구조외부 클래스 로딩네트워크/파일시스템 등에서 외부 .class를 로드할 수 있음- 사용자 정의 ClassLoader를 통해 구현- 꼭 로컬 classpath만 쓰지 않음런타임 바인딩컴파일 타임이 아닌 실행 중에 어떤 클래스가 사용될지 결정됨- 다형성 제공ex) SPI 예시) HotSwap더보기실행중인 JVM..

Java/JVM 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/JVM 2024.12.22

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 클래스 파일 (.class)하나의 클래스 또는 인터페이스의 구조와 바이트코드를 담고 있는 파일 (빅 엔디언 방식)✅ JVM이 실행할 수 있도록 컴파일된 결과물✅ 하위 호환성을 유지하며 확장됨 (최신 JVM 버전에서도 항상 실행됨) 메모리 저장 방식) 빅 엔디언더보기가장 큰 자리를 먼저 저장하는 방식 (사람이 읽는 방식과 같음)네트워크 바이트 오더ex) 0x1234 → 12 34 2. 구조항목설명특징매직 넘버파일 형식을 식별하기 위한 고정 값값은 0xCAFEBABE로 고정됨버전 번호이 클래스 파일이 어떤 JVM 스펙에 맞춰 생성되었는지 나타내는 값실행 가능 여부를 결정함상수 풀클래스에서 사용하는 모든 상수와 심볼 참조를 저장하는 ..

Java/JVM 2024.12.22

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

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

Java/JVM 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/JVM 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/JVM 2024.12.21

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

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

Java/JVM 2024.12.21

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다.1. 참조힙에 있는 객체의 메모리 주소를 가리키는 값✅ GC는 참조 그래프를 따라 GC Root로부터 도달 가능한지를 기준으로 객체의 생존 여부를 결정함 타입참조 타입정의 및 설명GC 수집 시점주요 용도Strong Reference일반적인 객체 참조❌일반 객체 참조Soft Reference메모리 부족 시에만 수집되는 참조⚠️ 메모리 부족 시캐시Weak Reference강한 참조가 사라지면, 다음 GC에 바로 수거 대상이 되는 참조✅메모리 누수 방지Phantom Reference객체가 완전히 GC 대상이 된 후 감지하기 위한 참조✅객체 이벤트 감지 예시) Soft Reference더보기SoftReference softRef = new ..

Java/JVM 2024.12.19