2024/12 77

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

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

Java 2024.12.24

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 톰켓: 정통 클래스 로더 아키텍처여러 개의 클래스 로더 웹 애플리케이션 별로 격리애플리케이션이 클래스 라이브러리를 독립적으로 사용할 수 있도록 보장한 서버에 여러 버전이 공존할 수 있음 클래스 라이브러리는 웹 애플리케이션에 공유 가능클래스 로더의 위임 모델 활용lib, classes 디렉토리 제공 서버는 웹 애플리케이션들의 영향을 최대한 받지 않아야 함보안과 안정성을 고려하여 격리된 환경을 제공 클래스 라이브러리 디렉토리 (웹 앱 클래스 로더)/lib톰켓 자신과 모든 웹 애플리케이션 /webapp/WEB-INF해당 웹 애플리케이션 핫 스왑 지원 (JSP 클래스 로더)서버를 재시작하지 않고도 수정된 JSP 파일이 즉시 반영됨자동으..

Java 2024.12.24

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 JVM 실행 엔진은 해석 실행과 컴파일 실행 두가지 방법으로 코드를 실행함 (선택 가능) 1. 해석 실행인터프리터 해석 과정어휘 분석구문 분석추상 구문 트리 생성인터프리터문장 실행 컴파일 해석 과정어휘 분석구문 분석추상 구문 트리 생성중간 코드 생성최적화목적 코드 생성 2. 명령어 집합스택 기반iconst_1iconst_1iaddistore_0바이트코드 명령어 스트림피연산자 스택을 이용해 동작장점이식성: 하드웨어 의존 X간결: 바이트 명령어 하나당 한 동작 수행 (매개변수 X) 단점속도 느림: 메모리를 빈번하게 접근함 레지스터 기반mov eax, 1add eax, 1매개 변수 2개를 받는 명령어

Java 2024.12.24

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 가상머신의 실행 엔진은 순수하게 소프트웨어로만 구현됨명령어 집합의 구조와 실행 엔진을 물리적 제약 없이 원하는 대로 만들 수 있음 1. 런타임 스택 프레임 구조메서드가장 기본적인 실행 단위 스택 프레임메서드 호출과 실행을 뒷받침하는 내부 데이터 구조필요한 깊이에 맞게 계산되어 크기가 정해짐실행중인 메서드의 스택 프레임은 맨 위에 있음 지역 변수 테이블매개 변수와 메서드 안에서 정의된 지역변수 저장하나의 변수 슬롯 범위로 변수 하나가 할당될 수 있음인덱스 방식0: this매개 변수들지역 변수들 피연산자 스택타입 크기 단위: 32비트스택 프레임간 공유상부의 지역 변수 테이블이 하부의 피연산자 스택과 공유됨성능 효율 목적 동적 링크메서드에..

Java 2024.12.24

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다1. JPMSJava 9에서 도입된 모듈 시스템자유롭게 설정 가능한 캡슐화 격리 매커니즘모듈 경계를 통해 각 모듈이 서로의 내부를 참조하지 못함기존의 클래스패스에 의존한 안정성 문제를 해결의존성이 실제 존재하는지는 런타임에서 확인되었음컴파일 타임에서 의존성 체크 후 실행 (모듈간의 의존성이 먼저 정의되어 있음) 모듈 정의module-info.java경계 정의 구성requires: 수입하는 모듈 목록exports: 내보내는 모듈 목록uses: 수입하는 서비스 목록provides: 내보내는 서비스 목록open: 내보내는 리플렉션 API 목록 모듈 호환성모듈 패스모듈 시스템에서 모듈이 위치하는 경로기존 클래스패스 방식과 호환되도록 도입된 방..

Java 2024.12.23

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 가상 머신 외부에서 다양한 방식으로 바이트 스트림을 로드하도록 하는 방법 1. 독립적인 공간같은 클래스 로더로 로딩되어야 동치 관계의 클래스라 판단함 2. 부모 위임 모델상위 클래스 로더에게 위임처음부터 클래스 로드 시도 X자신의 차례가 와서야 하위 클래스 로더가 로드 시도 접근 제한자식 클래스 로더는 부모 클래스 로더에서 로드된 클래스를 접근할 수 있음부모 클래스 로더는 자식 클래스 로더에서 로드한 클래스를 접근할 수 없음 구조부트스트랩 클래스 로더JVM 내장JAVA_HOME/lib or -XbootclasspathClass Lib 확장 클래스 로더JVM 외부에 독립적으로 존재java.lang.ClassLoader를 확장 (sun...

Java 2024.12.23

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 0. 동적 로딩클래스가 필요할 때 클래스가 jvm에 동적으로 로드됨자바는 런타임에 클래스 로딩, 링킹, 초기화가 이루어짐 장점높은 확장성, 유연성런타임에 클래스를 동적으로 교체 가능네트워크나 외부 소스에서 클래스파일을 가져와 쓸 수 있음JSP, OSGi런타입 바인딩 지원 단점성능 떨어짐 1. Loading특징클래스 로더 사용부트스트랩 클래스 로드 (JVM 내장)사용자 클래스 로더로드 방법 재정의 가능: ClassLoader의 findClass() or loadClass() 오버라이딩배열 클래스는 해당 없음JVM이 직접 메모리에 동적으로 생성클래스 로더가 생성 X 과정클래스를 정의하는 바이트 스트림을 가져옴여러 형식 지원ZIP, DB,..

Java 2024.12.23

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 바이트코드 명령어길이1바이트 최대 256개의 연산 코드 표현 가능 데이터 타입명령어 자체에 해당 연산에 필요한 데이터의 타입 정보가 포함됨iload: int 타입 데이터 로드istore: int 타입 데이터 스토어 2. 로드지역변수를 피연산자 스택에 로드 3. 스토어피연산자 스택의 연산 결과를 지역변수에 저장 4. 산술 명령어피연산자 스택의 값 두 개를 이용해 특정한 산술 연산을 수행결괏값을 다시 피연산자 스택의 맨 위에 저장 정수int 타입용 명령어만 지원iadd, isub, imul, idiv, irem, ineg, ishl, ior, iand, ixor, iinc, dcmpg 부동 소수점IEEE 754 명세를 엄격히 따름근..

Java 2024.12.22

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 클래스 파일하위 호환성을 위해 예전부터 지금까지 기존의 구조를 유지한 채 확장되어왔음하나의 클래스 또는 인터페이스를 정의바이트를 하나의 단위로 하는 이진 스트림 집합체빅 엔디언 방식 2. 의사 구조ClassFile { u4 magic; // 매직 넘버 (0xCAFEBABE) u2 minor_version; // 클래스 파일의 마이너 버전 u2 major_version; // 클래스 파일의 메이저 버전 u2 constant_pool_count; // 상수 풀 항목의 개수 cp_in..

Java 2024.12.22

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

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

Java 2024.12.21