전체 글 557

[JVM 밑바닥까지 파헤치기] 10-1. 프런트엔드 컴파일과 최적화: 프런트엔드 컴파일

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다1. 프런트엔드 컴파일java 파일을 class 파일(bytecode)로 변환하는 작업 javac프런트엔드 컴파일러jdk 6부터 표준 자바 클래스 라이브러리에 포함됨 (이전에는 tools.jar에 존재하였음)최적화 작업이 수행되지 않음 컴파일 과정준비플러그인 애너테이션 처리기들을 초기화함구문 분석토큰화추상 구문 트리 생성심벌 테이블 생성심벌 주소, 심벌 정보가 기입됨애노테이선 처리플러그인 애노테이션 처리기를 사용하여 처리함바이트코드 생성문법 검사제어 흐름 분석편의 문법 제거

Java 2024.12.24

[JVM 밑바닥까지 파헤치기] 9. 클래스 로딩과 실행 서브시스템, 사례와 실전

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 톰켓: 정통 클래스 로더 아키텍처항목설명여러 개의 클래스 로더 사용톰캣은 여러 개의 클래스 로더를 사용하여 웹 애플리케이션마다 격리된 클래스 로딩 구조를 유지함공유 라이브러리공통 라이브러리는 클래스 로더 위임 모델을 통해 공유됨 (예: lib, classes 디렉토리 사용)웹 앱 클래스 로더 디렉토리/lib: 톰캣 자체 및 모든 웹앱 공통/webapp/WEB-INF: 개별 웹앱 전용핫 스왑 지원 (JSP)JSP 파일 수정 시 서버 재시작 없이 자동 컴파일 및 적용됨 2. OSGi: 유연한 클래스 로더 아키텍처Java 기반의 동적 모듈 시스템 (OSGi = Open Services Gateway initiative)항목설명번들 (..

Java 2024.12.24

[JVM 밑바닥까지 파헤치기] 8-2. 바이트코드 실행 엔진: 바이트코드 해석

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 JVM 실행 엔진은 해석 실행과 컴파일 실행 두가지 방법으로 코드를 실행함 (선택 가능) 1. 해석 실행단계인터프리터 방식컴파일러 방식1. 어휘 분석소스코드를 토큰 단위로 분리동일2. 구문 분석문법 규칙에 맞는 구조로 변환동일3. 추상 구문 트리(AST)코드의 구조를 트리 형태로 구성동일4. 실행🔁 인터프리터가 AST를 순차적으로 실행🔁 중간 코드 → 최적화 → 목적 코드로 변환 후 실행최적화 여부거의 없음 / 제한적컴파일 단계에서 다양한 수준의 최적화 수행실행 결과한 줄씩 바로 실행 → 느리지만 즉각적 결과 확인 가능실행 전 전체 코드 컴파일 필요 → 실행 속도 빠름대표 언어Python, JavaScript, Ruby 등C, C..

Java 2024.12.24

[JVM 밑바닥까지 파헤치기] 8-1. 바이트코드 실행 엔진: 런타임

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 가상머신의 실행 엔진은 순수하게 소프트웨어로만 구현됨명령어 집합의 구조와 실행 엔진을 물리적 제약 없이 원하는 대로 만들 수 있음 1. 스택 프레임구성 요소설명메서드- 자바 실행의 기본 단위- 메서드 호출마다 스택 프레임 생성스택 프레임- JVM 스택에 생성되는 메서드 실행용 데이터 구조- 실행 중인 메서드의 프레임이 항상 스택의 최상단 스택 프레임 구성 요소항목설명지역 변수 테이블- 메서드의 매개변수와 지역변수 저장- 인덱스 기반 접근 (예: 0 = this, 1 = 첫 번째 매개변수)- 32비트 단위 슬롯 사용 (long, double은 2슬롯)피연산자 스택- JVM 명령어 실행 시 사용하는 임시 저장소- 연산 결과 저장- 32비..

Java 2024.12.24

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다1. JPMSJava 9에서 도입된 모듈 시스템항목설명목적모듈 단위의 캡슐화, 격리, 의존성 명시를 통해 기존 클래스패스 구조의 불안정성 해결기존 대비 차이점클래스패스는 런타임 의존성 오류 발생 가능 → JPMS는 컴파일 타임 의존성 체크핵심 파일module-info.java (모듈 경계와 공개 범위 정의)호환성기존 클래스패스와 병행 사용 가능 (--module-path vs --class-path) module-info.java키워드설명requires다른 모듈을 참조(의존)exports모듈 내부 패키지를 외부에 공개uses서비스 인터페이스 사용 명시 (e.g. ServiceLoader)providesuses 대상 인터페이스의 구현체 ..

Java 2024.12.23

[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