Java/JVM 22

[JVM 밑바닥까지 파헤치기] 12-3. 자바 메모리 모델과 스레드: 스레드

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 스레드 모델사용자 수준의 스레드와 운영체제의 커널 스레드를 어떻게 매핑하고 관리할 것인지에 대한 구조적 설계 방식 종류항목커널 스레드사용자 스레드하이브리드 스레드구현 위치커널 (운영체제 수준)사용자 공간 (라이브러리 수준)커널 + 사용자 공간매핑 방식커널 스레드 1개 ↔ 사용자 스레드 1개커널 스레드 1개 ↔ 사용자 스레드 N개커널 스레드 N개 ↔ 사용자 스레드 N개시스템 콜모든 스레드 작업에 필요❌상황에 따라 사용비용높음낮음 (컨텍스트 스위치 빠름)중간병렬 처리✅❌ (동시 실행 불가)✅유연성낮음높음 (유저가 직접 관리)높음단점커널 자원 한정, 생성 비용 큼하나가 블로킹되면 전체 정지구현 복잡도 높음핵심 메서드 모두가 네이티브 ..

Java/JVM 2024.12.26

[JVM 밑바닥까지 파헤치기] 12-2. 자바 메모리 모델과 스레드: 자바 메모리 모델

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 자바 메모리 모델자바 코드와 실제 메모리/CPU 사이의 추상화 규칙 집합✅ OS/하드웨어에 상관없이 동일하게 동작하기 위한 명세⚠️ 각 CPU는 캐시 구조가 다르고 메모리 일관성 모델이 다름⚠️ 같은 자바 코드이더라도 CPU/OS에 따라 다르게 동작할 수 있음➡️ 플랫폼에 상관없이 메모리를 일관된 방식으로 동작하도록 함 (가시성, 원자성, 순서 보장) 2. 메모리 상호작용메모리 구조항목메인 메모리작업 메모리정의모든 공유 변수가 저장되는 공간각 스레드가 가지는 고유한 메모리 공간접근 가능성모든 스레드가 접근 가능해당 스레드만 접근 가능역할프로그램 전역 상태 저장메인 메모리의 복사본으로 작업 수행데이터 이동read/write 명령어..

Java/JVM 2024.12.26

[JVM 밑바닥까지 파헤치기] 12-1. 자바 메모리 모델과 스레드: 동시성

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 컴퓨터가 여러 작업을 동시에 수행하는 이유연산 성능과 저장 및 통신 성능의 격차가 크기 떄문✅ 프로세서가 요청한 자원의 대기 시간을 활용✅ 서버는 여러 클라이언트 요청을 동시에 처리하므로 동시 처리가 필수적 동시성 프로그래밍의 어려움스케줄링 비결정성: 스레드 실행 순서는 매번 달라짐 (재현이 어려움)공유 메모리 문제: 가시성, 원자성, 순서 등으로 인해 예상치 못한 결과가 발생함 스케줄링 비결정성 문제) 실행 순서더보기Thread t1 = new Thread(() -> { for (int i = 0; i { for (int i = 0; i 실행할 때마다 순서가 바뀜어떤 스레드가 먼저 CPU를 잡을지는 OS 스케줄러에..

Java/JVM 2024.12.25

[JVM 밑바닥까지 파헤치기] 11-2. 백엔드 컴파일과 최적화: JIT 컴파일러

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 적시 컴파일러핫코드들을 탐지하여 컴파일하고 최적화하여 실행 효율을 높임 2. 내장 컴파일러구분특징목적/사용 시점클라이언트 컴파일러 (C1)빠른 컴파일 속도기본적인 최적화 적용GUI 프로그램빠른 응답성 중시서버 컴파일러 (C2)상대적으로 느린 컴파일복잡하고 고급 최적화 수행- 죽은 코드 제거, 범위 검사 제거, null 검사 제거- 루프 언롤링, 루프 호이스팅서버 환경장시간 실행되는 애플리케이션 최적화 3. 계층형 컴파일서버 모드의 기본 컴파일 전략계층컴파일러 종류프로파일링최적화 수준설명0없음 (인터프리터)❌❌초기 실행. 빠른 시작을 위한 인터프리터 실행1클라이언트 컴파일러(C1)❌기본 최적화간단한 최적화로 빠른 컴파일2클라이언트..

Java/JVM 2024.12.25

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다1. 백엔드 컴파일클래스 파일을 로컬 환경에 맞는 네이티브 코드로 변환하는 과정성능을 결정하는 핵심 지표필수 X (명세 존재하지 않음) 2. 인터프리터컴파일 단계없이 즉시 실행초기 실행 속도가 빠름소량의 메모리 환경에서 유리컴파일러의 최적화 동작이 잘못될 경우 차선책으로 사용됨프로파일링 수행 (최적화된 컴파일을 위함) 3. 컴파일러프로그램이 실행되는 시간이 길 경우 유리자주 실행되는 코드를 네이티브 코드로 컴파일해 실행 효율이 높임

Java/JVM 2024.12.25

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 제네릭매개 변수화된 타입 또는 매개 변수화된 다형성구분내용타입 소거컴파일 타임에만 타입 정보를 확인하고, 런타임에는 제거됨 (원시 타입으로 변환됨)장점하위 호환성 유지컴파일 시 타입 검사로 타입 안정성 확보단점런타임에는 제네릭 타입 정보가 사라져 타입 캐스팅 관련 제한 존재제약사항- instanceof E: ❌- new E(): ❌- new E[10]: ❌지원되지 않는 기능- 기본 타입(int, double 등) 직접 사용 불가 → 오토박싱/언박싱 필요- 제네릭 타입끼리 오버로딩 불가 2. 오토박싱, 언박싱래퍼 타입 / 복원 메서드로 자동 변환됨

Java/JVM 2024.12.25

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

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

Java/JVM 2024.12.24

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

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

Java/JVM 2024.12.24

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

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

Java/JVM 2024.12.24

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

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

Java/JVM 2024.12.24