Java 92

[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 구현사용자 공간에서 구현되는 스레드 라이브러리사용자 스레드의 생성, 소멸, 동기화, 스케줄링은 커널의 도움없이 온전히 사용자 공간에서 처리됨 하이브리드 구현커널 스레드와 사용자 스레드를 함께 이용하는 방법 자바 스레드운영체제의 커널스레드로 구현됨 (HotSpotVM) 스케줄링시스템이..

Java 2024.12.26

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 자바 메모리 모델다양한 하드웨어와 운영체제의 서로 다른 메모리 모델로부터 자바 프로그램을 보호하기 위함플랫폼에 상관없이 메모리를 일관된 방식으로 이용할 수 있음 2. 메모리 간 상호 작용메인 메모리모든 변수가 저장는 공간다양한 변수에 접근하는 규칙을 정의 작업 메모리각 스레드가 가지는 자체 작업 메모리격리되어 있음프로세스의 캐시와 비슷한 역할 프로토콜메인 메모리와 작업 메모리 간 상호작용을 위해 프로토콜이 정의됨read: 메인 메모리에서 데이터를 읽어 작업 메모리에 저장write: 작업 메모리에서 데이터를 읽어 메인 메모리에 저장load / store: 메인 메모리와 작업 메모리 간의 데이터 이동 VolatileJVM이 제공하..

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. 내장 컴파일러클라이언트 컴파일러빠른 컴파일과 기본 최적화 서버 컴파일러서버측 성능을 극대화하도록 설정된 컴파일러 고급 최적화죽은 코드 제거, 순환문 언롤링, 순환문 표현식 호이스팅범위 검사 제거, null 검사 제거 3. 계층형 컴파일서버 모드의 기본 컴파일 전략 계층 0인터프리터로 실행프로파일링 X 계층 1클라이언트 컴파일러 사용프로파일링 X기본 최적화만 계층 2클라이언트 컴파일러 사용기본 프로파일링만 (메서드 통계) 계층 3클라이언트 컴파일러 사용모든 프로파일링 계층 4서버 컴파일러 사용모든 프로파일링모든 최적화 4. 컴파일 대상과 촉발 조건핫코드자..

Java 2024.12.25

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

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

Java 2024.12.25

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 제네릭매개 변수화된 타입 또는 매개 변수화된 다형성 타입 소거동작 원리컴파일 타임에만 타입 정보 확인런타임에는 타입 정보 제거원시타입으로 변환됨타입이 같은 모든 제네릭 인스턴스의 공통 상위 타입타입캐스팅 관련 바이트코드가 자동으로 삽입됨 특징제네릭 타입과 상관없이 타입이 동일함 장점하위 호환성현재 버전보다 낮은 버전에서 실행될 수 있음 타입 안정성컴파일 타임에 타입 체크 단점제약사항if (item instanceof E) {} // XE newItem = new E(); // XE[] itemArray = new E[10]; // X인스턴스 여부 판단 불가제네릭으로 객체 생성 불가제네릭으로 배열 생성 불가 오버로딩..

Java 2024.12.25

[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