전체 글 554

[Effective Java] 2-1. 객체 생성과 파괴: 생성자 대신 정적 팩토리 메서드를 고려하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 정적 팩토리 메서드클래스는 생성자와는 별도로 static factory method 제공이 가능함 2. 장점이름을 가짐반환될 객체의 특성이 묘사되도록 할 수 있음public static Order primeOrder(Product product) { Order order = new Order(); order.prime = true; order.product = product; return order;}public static Order urgentOrder(Product product) { Order order = new Order(); order.urgent = true; orde..

Java 2024.12.26

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 스레드 구현OS 스레드다양한 하드웨어와 운영체제에서 운용할 수 있는 통합된 개념핵심 메서드 모두가 네이티브 코드로 구현됨항목커널 스레드 (1:1)사용자 스레드 (1:N)하이브리드 스레드구현 위치커널(운영체제 수준)사용자 공간 (라이브러리 수준)커널 + 사용자 공간매핑 방식사용자 스레드 1개 ↔ 커널 스레드 1개여러 사용자 스레드 ↔ 1개 커널 스레드여러 사용자 스레드 ↔ 여러 커널 스레드시스템 콜 필요모든 스레드 작업에 필요필요 없음상황에 따라 사용비용높음 (커널 호출 발생)낮음 (컨텍스트 스위치 빠름)중간병렬 처리가능 (다중 CPU 활용 가능)불가능 (동시 실행 불가)가능유연성낮음높음 (유저가 직접 관리)높음단점커널 자원 한정..

Java 2024.12.26

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 자바 메모리 모델다양한 하드웨어와 운영체제의 서로 다른 메모리 모델로부터 자바 프로그램을 보호하기 위함플랫폼에 상관없이 메모리를 일관된 방식으로 이용할 수 있음 2. 메모리 간 상호 작용항목메인 메모리 (Main Memory)작업 메모리 (Working Memory)정의모든 공유 변수가 저장되는 공간각 스레드가 가지는 고유한 메모리 공간접근 가능성모든 스레드가 접근 가능해당 스레드만 접근 가능역할프로그램 전역 상태 저장메인 메모리의 복사본으로 작업 수행데이터 이동read/write 명령어로 작업 메모리와 상호작용load/store 명령어로 메인 메모리와 동기화특성데이터 일관성을 위한 기준점계산은 여기서 수행되고, 결과는 메인 메..

Java 2024.12.26

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 컴퓨터가 여러 작업을 동시에 수행하는 이유연산 성능과 저장 및 통신 성능의 격차가 크기 떄문프로세서가 요청한 자원의 대기 시간을 활용서버는 여러 클라이언트 요청을 동시에 처리하므로 동시 처리가 필수적 JVM은 동시성 프로그래밍의 어려움을 낮춰줌하드웨어 자원 분배동시성 프로그래밍 2. 하드웨어의 효율과 일관성캐시메모리 I/O는 연산작업에 비해 매우 느림이를 보완하고자 메모리와 CPU 사이의 계층을 둠필요한 데이터를 캐시에 복사해 두어 작업을 빠르게 수행작업이 완료되면 결과 데이터를 캐시에서 메모리로 동기화 공유 메모리 멀티프로세스 시스템프로세서별 캐시는 각각 존재캐시 일관성 프로토콜공유 공간인 메인 메모리와 동기화를 수행MSI, ..

Java 2024.12.25

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

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

Java 2024.12.25

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

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

Java 2024.12.25

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

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

Java 2024.12.25

[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