메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

자바 최적화(2판)

클라우드 시대의 자바 성능 튜닝을 위한 실용적인 기법

한빛미디어

번역서

판매중

  • 저자 : 제임스 고프 , 벤저민 에번스
  • 번역 : 오지영 , 송지헌
  • 출간 : 2025-05-30
  • 페이지 : 560 쪽
  • ISBN : 9791169213868
  • eISBN : 9791169219471
  • 물류코드 :11386
  • 구판정보 :이 도서는 <자바 최적화>의 개정판입니다. 구판 정보 보기
  • 초급 초중급 중급 중고급 고급
4.9점 (12명)
좋아요 : 111

자바 성능 튜닝, 소문과 감에 의존하지 말고 과학적으로 접근하라!
구체적인 사례와 코드로 배우는 클라우드 네이티브 자바 실전 가이드


성능 튜닝은 실험 과학입니다. 막연한 추측이나 검증되지 않은 정보에 의존해서는 안 됩니다. 이 책은 중급 이상의 자바 개발자를 위해 복잡한 기술 스택 환경에서 자바 클라우드 애플리케이션의 성능을 정량적이고 검증 가능하며 반복할 수 있는 방식으로 튜닝하는 방법을 소개합니다.
2판에서는 특히 클라우드 환경에서 자바 애플리케이션의 성능을 최적화하는 데 중점을 둡니다. 대부분의 자바 성능 자료가 JVM 이론이나 내부 구조 설명에 머무는 데 반해, 이 책은 레시피, 팁과 트릭, 알고리즘 등 실용적인 성능 튜닝 방안을 깊이 있게 다룹니다.
 

주요 내용

  • 최신 하드웨어, 운영 체제, 클라우드 스택을 최대한 활용하는 자바 원리와 기술
  • 자바 성능 수치를 측정할 때 자주 빠지는 함정과 마이크로벤치마킹의 한계
  • 자바/JVM 애플리케이션을 클라우드 환경에서 패키징, 배포, 운영, 디버깅하는 방법
  • 최신 관찰 가능성 도구를 활용한 클라우드 네이티브 애플리케이션 심층 분석
  • 병렬 처리와 분산 시스템 등 다양한 자바 성능 최적화 기법

 

대상 독자

  • 클라우드 플랫폼 엔지니어: 컨테이너 한 대당 메모리를 절반으로 줄이고 싶은 분
  • 마이크로서비스 설계자: 스프링부트, 쿼커스 중 무엇이 우리 팀에 맞을지 고민하는 분
  • 퍼포먼스, SRE 담당자: JFR, JIT 로그, ZGC 튜닝으로 지연 시간을 자유자재로 다뤄야 하는 분
  • 주니어 개발자: ‘자바=느림’이라는 낡은 편견을 깨고 싶은 모든 분

 

제임스 고프 저자

제임스 고프

모건 스탠리의 최고 엔지니어로서 클라우드 네이티브 아키텍처와 API 프로그램을 담당하고 있습니다. 자바 챔피언으로 활동 중이며, 런던 자바 커뮤니티를 대표해 자바 커뮤니티 프로세스 실행 위원회에서 활동했습니다. 또한 OpenJDK 프로젝트에 기여하였으며, 『Mastering API Architecture』의 공동 저자로, 소프트웨어 아키텍처와 저수준 자바 프로그래밍 기술에 대한 전문 지식과 경험이 풍부합니다.

 

벤저민 에번스 저자

벤저민 에번스

레드햇 런타임즈에서 수석 소프트웨어 엔지니어이자 관측성 총괄을 맡고 있는 아키텍트, 저자, 교육자입니다. 또한 자바 챔피언이며, 『자바 최적화』를 포함해 7권 이상의 프로그래밍 서적을 집필한 자바 전문가입니다. 전에는 뉴렐릭에서 계측 담당 수석 아키텍트로 재직했으며, 마이크로소프트에 인수된 제이클래리티의 공동 창립자이기도 합니다. 또한 자바 SE/EE 실행 위원회 멤버로 활동한 경력이 있습니다.

 

오지영 역자

오지영

오랜 시간 소프트웨어 개발과 교육 현장을 넘나들며 활동한 컴퓨터 공학 박사입니다. 대학에서 자바, C, 파이썬을 비롯한 여러 프로그래밍 언어와 알고리즘, 자료구조, RDB 등 다양한 강의를 진행하며 기초 이론부터 실무 중심 개발까지 폭넓은 교육 경험을 쌓아왔습니다.
현재는 GS비즈플 AX사업센터 센터장으로 재직 중이며, AI 기반 서비스 개발과 이를 뒷받침할 플랫폼 구축을 총괄하고 있습니다. 특히 자바를 중심으로 한 지능형 서비스 플랫폼을 설계하고 있으며, 마이크로서비스 아키텍처, 비동기 처리, API 설계, 성능 최적화 등 기술 전반을 총괄하는 실무형 기술 리더 역할을 하고 있습니다.

송지헌 역자

송지헌

데이터 과학자이자 AI 개발자로 다양한 산업 분야에서 데이터 분석, AI/ML 모델 개발, 플랫폼 구축에 이르기까지 폭넓은 실무 경험을 보유하고 있습니다.
다양한 도메인에서의 실무와 컨설팅을 통해 확장성과 유연성이 요구되는 클라우드 환경 경험, 데이터 및 AI 산업 기술 전반에 대한 이해를 바탕으로, 현재는 클라우드 네이티브 기반 AI 서비스 및 SaaS 솔루션을 설계하고 개발하는 데 집중하고 있습니다.

CHAPTER 1 최적화와 성능 정의 
_1.1 잘못된 자바 성능 최적화 방법
_1.2 자바 성능 개요
_1.3 실증 과학으로서의 성능
_1.4 성능을 위한 분류 체계
_1.5 성능 그래프 읽기
_1.6 클라우드 시스템의 성능
_1.7 요약

 

CHAPTER 2 성능 테스트 방법론
_2.1 성능 테스트 종류
_2.2 모범 사례 개론
_2.3 성능 안티 패턴의 원인
_2.4 자바 가상 머신 성능을 위한 통계
_2.5 통계 해석
_2.6 인지적 편향과 성능 테스트
_2.7 요약

 

CHAPTER 3 자바 가상 머신 개요
_3.1 인터프리팅과 클래스 로딩
_3.2 바이트코드 실행
_3.3 핫스팟 소개
_3.4 JIT 컴파일 소개
_3.5 자바 가상 머신 메모리 관리
_3.6 스레딩과 자바 메모리 모델
_3.7 자바 가상 머신 모니터링 또는 도구
_3.8 자바 구현, 배포 또는 릴리스
_3.9 요약

 

CHAPTER 4 가비지 컬렉션 이해하기
_4.1 마크 앤 스윕 소개
_4.2 가비지 컬렉션 용어집
_4.3 핫스팟 런타임 소개
_4.4 할당과 수명 주기
_4.5 약한 세대 가설
_4.6 핫스팟의 프로덕션 가비지 컬렉션 기술
_4.7 병렬 컬렉터
_4.8 할당의 역할
_4.9 요약

 

CHAPTER 5 고급 가비지 컬렉션
_5.1 트레이드오프와 플러그형 컬렉터
_5.2 동시 가비지 컬렉션 이론
_5.3 G1
_5.4 셰넌도어
_5.5 ZGC
_5.6 Balanced(이클립스 OpenJ9)
_5.7 니치 핫스팟 컬렉터
_5.8 요약

 

CHAPTER 6 자바 가상 머신에서 코드 실행
_6.1 전통적인 자바 애플리케이션 수명 주기
_6.2 바이트코드 해석 개요
_6.3 핫스팟에서의 JIT 컴파일
_6.4 자바 프로그램 실행의 진화
_6.5 요약

 

CHAPTER 7 하드웨어와 운영 시스템
_7.1 현대 하드웨어 소개
_7.2 메모리
_7.3 현대 프로세서의 특징
_7.4 운영 체제
_7.5 간단한 시스템 모델
_7.6 요약

 

CHAPTER 8 클라우드 스택의 구성 요소
_8.1 클라우드 스택을 위한 자바 표준
_8.2 클라우드 네이티브 컴퓨팅 재단
_8.3 가상화
_8.4 이미지와 컨테이너
_8.5 네트워킹
_8.6 Fighting Animals 예제 소개
_8.7 요약

 

CHAPTER 9 클라우드에서의 자바 배포
_9.1 로컬 환경에서 컨테이너 작업하기
_9.2 컨테이너 오케스트레이션
_9.3 배포 기술
_9.4 자바 특화 고려 사항
_9.5 요약

 

CHAPTER 10 관측성 소개
_10.1 관측성이 중요한 이유
_10.2 세 가지 핵심 요소
_10.3 관측성 아키텍처 패턴과 안티 패턴
_10.4 관측성 기반의 애플리케이션 문제 진단
_10.5 상용 솔루션과 오픈 소스 소프트웨어
_10.6 요약

 

CHAPTER 11 자바에서 관측성 구현
_11.1 마이크로미터 소개
_11.2 자바 개발자를 위한 프로메테우스 소개
_11.3 오픈텔레메트리 소개
_11.4 자바에서 오픈텔레메트리 추적 적용
_11.5 자바에서 오픈텔레메트리 지표 적용
_11.6 자바에서 오픈텔레메트리 로그 적용
_11.7 요약

 

CHAPTER 12 프로파일링
_12.1 프로파일링 소개
_12.2 GUI 기반 프로파일링 도구
_12.3 샘플링과 세이프포인트 편향
_12.4 최신 프로파일러
_12.5 JDK Flight Recorder(JFR)
_12.6 프로파일링의 운영적 측면
_12.7 메모리 프로파일링
_12.8 요약

 

CHAPTER 13 동시성 성능 기법
_13.1 병렬 처리 소개
_13.2 자바 메모리 모델의 이해
_13.3 동시성 라이브러리 구축
_13.4 동시성 라이브러리 요약
_13.5 실행기와 작업 추상화
_13.6 가상 스레드
_13.7 요약

 

CHAPTER 14 분산 시스템 기법과 패턴
_14.1 기본적인 분산 데이터 구조
_14.2 합의 프로토콜
_14.3 분산 시스템 예제
_14.4 Fighting Animals 개선
_14.5 요약

 

CHAPTER 15 현대적 성능과 미래
_15.1 새로운 동시성 패턴
_15.2 파나마
_15.3 라이덴
_15.4 발할라
_15.5 결론

 

Appendix A 마이크로벤치마킹
Appendix B 성능 안티 패턴

클라우드 시대의 자바, 한계를 뛰어넘는 최적화의 기술


클라우드 환경에서의 자바 성능 최적화는 단순한 코딩 기술을 넘어 인프라 전반에 걸친 깊이 있는 이해와 지속적인 관리가 요구되는 영역입니다. 이 책은 클라우드 네이티브 환경에서 자바를 효과적으로 활용하는 방법과 성능 최적화 전략을 체계적으로 다룹니다. 단순히 자바 개발자만을 위한 내용에 국한되지 않고, 클라우드 환경에서 시스템 최적화와 성능에 궁금증을 가진 모든 분께 유익한 길잡이가 될 것입니다. 
 

JVM의 메모리 관리와 가비지 컬렉션부터 클라우드 환경에서의 배포 및 관측 가능성, 프로파일링, 병렬 처리 기법과 분산 시스템 패턴까지 폭넓게 다룹니다. 특히 성능 테스트 방법론, 하드웨어 및 운영 체제와의 상호작용, 컨테이너와 가상화 기술 등 현실적이고 실무적인 주제들을 꼼꼼하게 다룹니다. 더 나아가 현대적인 자바 애플리케이션 개발과 배포 전략, 마이크로서비스 환경에서의 성능 이슈와 해결 방법 등 현장에서 즉시 적용할 수 있는 유용한 지침도 담고 있습니다. 이 책은 여러분의 실무 역량을 한 단계 높이는 데 큰 도움이 될 것입니다.

『Optimizing Cloud Native Java: 자바 최적화 2판』은 클라우드 환경에 맞춰 자바 애플리케이션 성능을 최적화하는 새로운 접근법을 제시한다. 기존 서적들이 단편적인 지식 나열에 그쳤다면, 이 책은 클라우드에 특화된 구조적이고 데이터 기반의 문제 해결 방식을 보여준다. 단순한 JVM 튜닝을 넘어, 자바 애플리케이션과 클라우드 인프라의 복잡한 상호작용까지 총체적으로 다룬다는 점이 특징이다.

 

이 책이 좋았던 점 중 하나는 JVM 내부부터 하드웨어, 운영체제, 클라우드 인프라, 그리고 최신 자바 기능까지 아우르는 방대한 내용을 체계적으로 다룬다는 점이다. 자바가 현대 환경을 어떻게 최대한 활용하는지, 그리고 애플리케이션을 어떻게 패키징, 배포, 운영 및 디버깅할 수 있는지 명확히 설명한다. 이 책은 개발자가 여러 계층을 넘나들며 사고하여, 성능 문제 해결에 보다 효과적인 접근 방식을 가능하게 한다.


3장 "JVM 개요"는 JVM이 자바를 실행하는 방식과 HotSpot, JIT 컴파일러를 소개하며, 6장 "JVM에서의 코드 실행"은 바이트코드 해석, JIT 컴파일 및 프로파일 기반 최적화를 상세히 설명한다. 이러한 심층적인 내용은 피상적인 튜닝을 넘어 특정 최적화가 왜 작동하는지에 대한 근본적인 지식을 제공한다. Java가 현대 하드웨어, 운영체제 및 클라우드 스택을 어떻게 최대한 활용하는지 보여주는데, 특히 리소스 할당(CPU, 메모리)이 동적이고 공유되는 클라우드 환경에서 이는 매우 중요하다. JVM의 JIT 컴파일러가 CPU 캐시 및 분기 예측과 어떻게 상호작용하는지, 또는 스레딩 모델이 OS 스케줄러를 어떻게 활용하는지 이해하는 것은 클라우드 환경 성능에 직접적인 영향을 미친다. 4장 "가비지 컬렉션 이해하기"는 GC 용어와 핵심 이론, 그리고 실제 GC 기술을 다룬다. 이러한 기초 지식은 고급 컬렉터를 이해하는 데 필수적이다. 5장 "고급 가비지 컬렉션"은 이 책의 핵심 강점으로, G1, Shenandoah, ZGC 등 가장 최신의 GC 종류에 대해서도 상세히 소개한다. 이들 컬렉터의 장단점과 JVM 내에서 "플러그형 컬렉터"로 작동하는 방식을 설명하며, 동시성 GC 이론도 다룬다. 클라우드 환경에서 GC 튜닝은 단순히 OOM 방지를 넘어선다. 이는 동적이고 제한된 컨테이너 환경에서 리소스 활용(메모리, CPU)을 최적화하고 지연 시간 목표를 맞추는 것을 의미한다. 이 책은 워크로드 특성 및 클라우드 리소스 제약 조건을 기반으로 적절한 GC 선택을 가능하게 하여, 진정한 최적화를 가능케 한다.


"클라우드 네이티브" 키워드에 충실하게 가상화, 컨테이너, 쿠버네티스와 자바 애플리케이션의 상호작용을 설명한다. 이는 자바의 전통적인 가정이 공유되고 리소스가 제한된 클라우드 환경의 현실과 충돌하는 상황에서 매우 중요하다. 컨테이너 환경에서 자바 애플리케이션이 메모리, CPU, 네트워크 리소스를 어떻게 소비하는지에 대한 실전 팁을 많이 주는데, 특히 "컨테이너의 cgroup과 같은 리소스 제한과 어떻게 상호작용하는지에 대한 이해"는 전통적인 방식으로는 자바 최적화를 달성할 수 없는 부분이다. JVM이 컨테이너 리소스 제한과 어떻게 상호작용하는지 이해하지 못한 채 클라우드에 자바 애플리케이션을 배포하는 것은 성능 불안정 및 리소스 낭비로 이어질 수 있다. 이 책은 자바 개발자를 "클라우드 인식" 개발자로 성장시켜, 컨테이너 환경에서 애플리케이션이 번성할 수 있도록 돕는다.


클라우드 네이티브 자바를 위한 포괄적인 관측성도 중요한 주제다. 관측성의 핵심 요소인 지표, 추적, 로깅에 대한 내용을 다루며, 이는 복잡한 분산 시스템에서 성능 문제를 진단하는 데 매우 중요하다. 이 책은 "클라우드 네이티브 애플리케이션에 대한 깊은 이해를 위해 새로운 관측성 접근 방식"을 적용하도록 돕는다. JDK Flight Recorder(JFR)는 강력한 프로파일링 도구로 명시적으로 언급된다. JFR을 활용하여 "런타임 성능 병목"을 식별하는 방법에 대한 책의 지침은 매우 중요하다. JFR은 낮은 오버헤드로 JVM 및 애플리케이션 동작에 대한 상세한 통찰력을 제공하여, 프로덕션 환경에서 성능 문제를 정확히 찾아내는 데 필수적이다. 이 책이 관측성 도구에 중점을 두는 것은 개발자가 분산 서비스 전반의 성능을 효과적으로 모니터링, 진단 및 문제 해결할 수 있도록 지원한다.

『Optimizing Cloud Native Java: 자바 최적화 2판』은 기존 자바 성능 서적의 한계를 뛰어넘어 진정으로 총체적이고 문제 중심적인 접근 방식을 제시한다. JVM 내부부터 클라우드 인프라 및 현대 애플리케이션 문제에 이르기까지 전체 성능 스택을 체계적으로 다룬다. 단순히 코드를 더 빠르게 만드는 것을 넘어, 복잡한 클라우드 생태계에서 자바 애플리케이션이 최적으로 안정적으로 작동하도록 돕는 데 중점을 둔다. 

자바 성능, 감이 아닌 과학으로 접근하라

『자바 성능 최적화 2판』 실전 리뷰

클라우드 환경에서 자바 애플리케이션의 성능을 어떻게 개선할 수 있을까? 단순히 GC 로그를 보는 것으로는 부족하고, 코드 리팩토링만으로는 한계가 있다.

『자바 성능 최적화 2판』은 자바 성능 튜닝을 정량적이고, 실험 가능한 방식으로 접근할 수 있도록 돕는 실전 지침서다.

왜 이 책을 추천하는가?

이 책은 성능 튜닝을 “느린 것 같아서”가 아니라 측정과 수치 기반으로 접근해야 한다는 명확한 메시지를 던진다.

GC 튜닝, JIT 컴파일, 스레드 최적화는 물론, 클라우드 환경에서 자바가 어떤 전략으로 운영되어야 하는지까지 폭넓게 다룬다.

특히 일반적인 성능 튜닝 서적과 달리, 이 책은 현업의 문제를 해결하는 데 초점을 맞추고 있다.

주요 내용 요약

GC 알고리즘 (G1, ZGC, Shenandoah 등)의 실제 적용과 한계

JDK Flight Recorder, Micrometer, OpenTelemetry로 성능 관측성 구현

컨테이너 환경에서 자바 프로세스를 최적화하는 전략

JIT, 바이트코드, 가상 스레드 등 JVM 내부 동작 원리 설명

마이크로서비스 기반 분산 시스템에서의 자바 최적화 방법

특히 인상 깊었던 부분

1. 성능 튜닝은 과학이다

벤치마킹 결과 없이 “느려 보인다”는 감에 의존해서는 안 된다. 마이크로벤치마킹의 한계와 올바른 테스트 방법론까지 꼼꼼하게 설명한다.

2. 관측성을 위한 실무 가이드

단순한 로그 수집을 넘어서, Prometheus와 OpenTelemetry 기반의 지표, 로그, 트레이싱 구현 방법까지 실무 중심으로 다룬다.

3. 클라우드 환경에 최적화된 JVM 전략

컨테이너에서 JVM의 메모리를 어떻게 조정해야 하는지, 오케스트레이션 환경에서는 어떤 문제가 발생하는지 등 운영 관점에서의 통찰이 담겨 있다.

이런 분께 추천합니다

대규모 트래픽을 처리하는 자바 백엔드를 운영 중인 개발자

GC, JFR, 관측성 등 성능 튜닝 요소를 직접 다뤄보고 싶은 분

마이크로서비스 아키텍처에 맞는 JVM 성능 전략이 궁금한 분

자바에 대한 오랜 편견에서 벗어나고 싶은 개발자

이 책은 단순히 자바 최적화 기법을 알려주는 책이 아닙니다.

자바를 둘러싼 시스템 전체를 이해하고, 문제를 진단하고, 해결하는 사고방식을 기를 수 있게 해줍니다.

“성능은 감이 아닌 과학으로, 최적화는 반복 가능한 실험으로.”

이 책의 핵심 메시지처럼, 이제 자바 개발자도 실험과 관측을 기반으로 더 나은 서비스를 만들어야 할 때입니다.

 

자바는 블루칼라 언어입니다. ​ 박사 논문용이 아닌 실용적인 일을 위한 언어입니다. 이 말은 자바의 아버지인 제임스 고슬링이 한 말입니다. 이러한 철학으로 자바의 가장 큰 강점은 한 번 작성하면 어디에서나 실행 가능 한점이죠. 자바 가상 머신(JVM)을 통해 다양한 운영체제에서 동일한 코드를 실행할 수 있어 소프트웨어 개발과 배포에 실용적입니다. ​ 또한 자바의 초기 성능 관점은 환경이 충분히 빠르다면 원시 성능을 어느정도 희생하더라도 개발 생산성을 높이것에 중요하다라는 것이었습니다.

 

개발자가 세부적인 저수준 제어를 포기하는 대신, 관리되는 기능의 내부 동작을 걱정하지 않아도 되는 구조 입니다. ​ 대표적인 예는 메모리관리 부분입니다. 자바 가상 머신은 가비지 컬렉션 서브시스템을 통해 자동으로 메모리 관리해 프로그래머가 메모리를 수동으로 추적할 필요가 없습니다. ​ 그러나 이러한 자동화는 때로 성능 저하로 이어질 수 있으므로 체계적인 성능 측정과 최적화가 필수적입니다. 이를 도와줄 책이 나왔습니다. 바로 자바 최적화 책인데요. 자세히 알아보도록 하겠습니다. ​

 

 

1) 오라클이 선정한 자바 전문가

자바 챔피언은 자바 생태계 발전에 탁월한 기여와 영향력을 인정받아 오라클이 공식 선정하는 세계적 수준의 자바 전문가입니다. ​ 자바 공화국인 우리나라에서 자바챔피언은 다소 생소합니다. 2명만 있기 때문인데요. 국내 최초는 한국자바개발자협의회 양수열 회장(2005)님과 Netty의 개발자로 오픈소스계의 전설인 이희승님(2020)이 있습니다. ​ 자바 최적화 2판 책의 두명의 저자인 벤저민 J. 에번스(2013), 제임스 고프(2020)도 자바 챔피언입니다. 벤저민 J.에번스는 JVM 전문가로 MS가 인수한 jClartiy의 공동 창립자였습니다. 한편 마이크로소프트가 인수한 jClarity의 기술력을 바탕으로 개발된 GC 분석 툴이 GCToolkit입니다. ​ 또한 공저자인 제임스 고프는 OpenJDK 프로젝트에 기여한 바있습니다.

 

 

2) 1판과 2판의 차이점

자바 최적화 1판(2018)은 JVM의 구조, JIT 컴파일러, GC, 스레딩 등 Java 성능의 근본 원리를 깊이 있게 다룹니다. 물리적인 서버에서 클라우드로 운영 방식이 변경 됨에 따라 2판에서는 클라우드 네이티브 환경(컨테이너, 마이크로서비스, 분산 시스템)에서의 Java 성능 최적화에 초점을 맞춥니다. ​ 즉 1판은 JVM 중심의 전통적 성능 최적화 이론과 방법론에 집중한다면 2판은 클라우드 환경에서 실전적 성능 관리와 최신 기술 트렌드를 포괄적으로 다룹니다.

한빛미디어 서평단 <나는 리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.

 

어떤 책인가요?

자바 성능 튜닝을 해보고 싶은 분들이 보면 좋을 책

자바의 메모리 구성과 프로파일링, 마이크로벤치마킹 등을 해보고 싶은 분들이 보면 좋을 책

2019년 4월에 나온 Optimizing Java 1판에 이어 2025년 5월에 2판이 나왔다.

기존 책도 컬러로 되어있어서 보기 편했는데, 이번 2판도 컬러인쇄로 만들어져서 좋았다^o^.

 

이전 1판과 달라진 부분

클라우드 환경에서 더욱 복잡해진 자바 성능 문제를 푸는 방법이 추가됐다.

클라우드 스택, 가상화, 이미지/컨테이너 등에 대하여 JVM 환경에서 어떻게 최적화 할 수 있는지에 대해 알 수 있다.

 

인상적이었던 부분

관측성 개념과 관측을 하기 위한 아키택처 패턴 및 안티 패턴, 성능 안티 패턴들에 대해서도 알 수 있어서 좋았다.

13번째 챕터의 동시성 성능 기법에서 자바의 병렬처리, 가상 스레드에 대한 내용이 있었는데 흥미로웠다.

추가로 1판의 마지막 챕터에서는 그랄VM 등과 자바9와 미래에 대한 내용이 나왔다면 이번은 새로운 동시성 패턴, 파나마/라이덴/발할라 등미래지향적인 자바진영의 프로젝트들에 대해서 엿볼 수 있었다.

※ 한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.

이 책은 자바 애플리케이션을 좀 더 잘 운영하고 관리하기 위한 최적화된 기술을 배울 수 있는 책이다.

대다수의 자바 개발자들이 프로그래밍을 위한 언어 사용법을 배우지만 프로그래밍 외에 좀 더 안정적이고 최적화된 운영을 위한 방법을 직접적으로 배울 수 있는 방법은 드물다.

처리량과 지연 시간, 수용량과 활용도 뿐만 아니라 확장성과 효율성 그리고 성능 저하 같은 기본적인 성능상의 요소들이 왜 중요한지 파악하는 것이 중요하고 이 요소들이 동시에 최적화하기는 어렵기 때문에 성능 최적화를 위한 올바른 목표를 설정하고 추구하는 것이 중요하다.

이런 자바의 성능을 튜닝하는 실용적인 기법들을 이 책에서 다룬다.

총 15장으로 이루어진 총 5가지 주제를 다룬다.

가장 처음으로 다루는 주제는 여러 정의를 통한 자바 성능을 최적화하기 위한 개념을 다지고 성능을 논할 때 사용할 프레임워크를 수립하는 부분도 다룬다.

이후에는 자바 성능에 대한 내용을 다룰 때 자주 등장하는 문제와 함정을 살펴보는 과정도 다룬다.

특히 첫번째 장에서는 잘못된 자바 성능을 최적화하기 위한 기본 핵심을 다루기 때문에 더 좋은 성능을 위한 엔지니어링을 위한 여러 내용을 집중적으로 다루기 때문에 이러한 성능 문제가 발생했을 때 이를 폭넓게 이해하고 해결할 수 있는 기반의 내용을 다루기 때문에 첫장에서 다루는 내용은 꼼꼼히 읽고 이해할 수 있도록 해야한다.

이후에는 자바의 성능 테스트 방법론을 다루는데 이 부분은 실무를 하면서 많이 접할 수 있는 테스트의 종류이다.

각 테스트별로 어떠한 성능의 종류를 테스트하기 위한 것인지에 대해 다루기 때문에 특히나 실무에서 접할 수 있는 내용이므로 성능 테스트 방법론의 내용을 정리해보는 것도 추천한다.

이후에는 자바 개발자라면 알고 있을 내용인 JVM에 대한 내용을 다룬다.

JVM의 구성 요소들과 함께 이를 모니터링하기 위한 도구를 소개하며 이후에는 JVM의 구성요소인 GC, JIT의 각 요소에서 자바의 성능을 좌우하는 부분에 대한 내용과 함께 이를 잘 다루기 위한 방법을 다룬다.

이를 통해서 왜 성능이 느려지는 지에 대한 원인을 파악할 수 있고 이를 해결할 수 있는 방안들을 생각해볼 수 있다.

GC와 JIT를 다룬 이후에는 하드웨어의 관점에서의 하드웨어를 이루는 메모리와 캐시, 프로세서, OS에 대한 기본 이해를 통해 애플리케이션 성능에 영향을 미치는 하드웨어 측면에서의 안정된 사용 방법을 이해할 수 있다.

이후에는 클라우드 플랫폼 환경에서 자바의 성능을 효과적으로 관리하는 최적화 방법을 다룬다.

클라우드 플랫폼 환경에서 자바 애플리케이션을 잘 운영하기 위한 가상화 고려사항과 함께 클라우드 환경의 이미지와 컨테이너의 기초 내용도 다루고 있다.

또한 클라우드 네이티브의 스택의 중요 요소인 네트워킹은 서비스를 검색하고 트래픽을 라우팅하는 중요한 고려사항을 다루고 있다는 점에서 클라우드 플랫폼 환경에서 이해할 기본 내용과 핵심을 이해해야 이후에 다루는 내용을 이해할 수 있다.

이러한 기본 내용 이후에는 클라우드 환경에서 자바 애플리케이션을 배포하기 위한 구성요소들과 함께 배포의 원리와 방식을 소개한다.

클라우드 환경에서 블루/그린 배포, 카나리 배포는 한번쯤 들어보았을 배포 전략이다.

이런 배포 기술의 원리와 각각의 특징, 장/단점을 통해 서비스와 상황에 맞는 배포 전략을 이해할 수 있다.

이후에는 모니터링 시스템의 연장으로 더 확장되고 일반화된 모니터링 기술을 넘어 새로운 기능을 제공하는 관측성에 대한 내용을 다룬다.

관측성은 시스템의 내부 상태를 외부에서 얼마나 잘 추론하는 가라는 질문에서 시작이 되는데 이를 통해 장애 상황을 해결하는 과정 뿐만 아니라 다양한 활용 가능성을 가지고, 컨테이너 환경과 같은 새로운 운영 방식에서 시스템이 업그레이드 되거나 유지되기보다 문제의 상황이 발생되면 안정적인 버전으로 롤백하거나 새로운 빌드로 전환하는 방식에서 변화된 서비스의 운영 방식 뿐만 아니라 확장의 규모에서 문제를 해결하도록 하는 내용을 다룬다.

후반부에서는 가상 스레드와 분산 패턴을 통해 클라우드 규모의 동시성에 관한 내용을 다룬다.

동시성은 특히나 서비스가 확장되고 복잡해지면 더더욱 중요해진 기술이다.

동시성에 대한 개념과 함께 자바 영역에서 제공하는 동시성 라이브러리들은 실무에서 자주 다루는 부분들이다.

특히나 자바의 동시성과 비동기 실행 방식, 가상 스레드를 다루는 내용은 어려울 수 있지만 분명 실무에서 자주 다루는 서비스 로직의 한 부분이기 때문에 어렵더라도 이들의 사용 원리를 이해하기를 추천한다.

마지막 장에서는 자바의 JVM의 미래를 생각하는 내용으로 마무리를 짓는다.

복잡해지는 서비스를 개발/운영하기 위해 자바의 관점 뿐만 아니라 클라우드 환경에서 자바 애플리케이션을 안정적으로 운영하기 위한 기법들을 다룬다는 점에서 개인적으로 많은 도움을 받았다.

서비스를 운영하면서 성능 관점에서 최적화되지 않은 부분들을 접할 수 있었다.

그때마다 가장 먼저 프로그래밍 관점에서 최적화한 부분도 있지만 이외에 하드웨어와 인프라 관점에서도 성능을 개선한 부분도 있었다.

다양한 관점에서 자바 애플리케이션의 성능을 최적화하기 위한 특히나 클라우드 환경에서 최적화하는 방법을 다루고 여러 지표와 사례를 통해 상황별 해결 방안을 이해하고 최적화하는 방법을 익힐 수 있었다.

앞서 말했듯이 어려울 수 있는 내용들도 많지만 프로그래밍 관점 외에 더 확장된 영역에서 서비스를 안정적으로 운영하기 위한 방법을 이해할 수 있기 때문에 어렵더라도 완독하기를 추천한다.

 

"자바 최적화 2판"은 현대 클라우드 환경에서 자바 애플리케이션의 성능을 과학적이고 정량적인 방식으로 최적화하는 방법을 제시하는 실전 가이드입니다. 이 책은 단순한 이론을 넘어, 실제 현장에 바로 적용 가능한 실용적인 기법들을 제공합니다.

 

JVM의 심층 분석부터 최신 가비지 컬렉션(GC) 튜닝 노하우, 그리고 성능 문제 진단을 위한 관측성(Observability) 도구(마이크로미터, 프로메테우스) 및 프로파일링 기법(JDK Flight Recorder) 활용법까지, 현장에서 필요한 핵심 지식들을 망라합니다. 또한, 동시성, 분산 시스템 등 고급 성능 기법과 Project Loom 같은 미래 자바 기술 트렌드까지 다루어 독자의 시야를 넓혀줍니다.

 

중급 이상의 자바 개발자, 클라우드 플랫폼 엔지니어, SRE 담당자 등 자바 성능에 대한 깊은 이해와 실무 능력을 키우고 싶은 모든 분들께 이 책은 필독서입니다. '자바는 느리다'는 편견을 깨고 실제 프로젝트에서 안정적이고 효율적인 시스템을 구축하고자 한다면, "자바 최적화 2판"이 명확한 해답을 제시할 것입니다.

 

 

**한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.**

 

많은 개발자들은 자바를 “느리고 무겁다”고 말합니다. 높은 메모리 사용량, 기동 시간 지연, GC 일시정지 등은 자바의 고질적인 단점처럼 여겨지곤 하죠. 하지만 그 모든 성능 이슈를 단순히 “자바라서”라고 말할 수 있을까요? 이 책 『자바 최적화』는 그러한 고정관념을 깨부수며, 자바 성능 문제를 시스템 전체 흐름 속에서 조망할 수 있게 돕는 드문 책입니다.

 

책의 전반부는 자바 애플리케이션이 느려지는 이유를 JVM 내부 구조, 현대 CPU 아키텍처, 메모리 계층, OS 스케줄링, GC 등 다층적인 관점에서 설명합니다. 1~3장은 단순한 JVM 튜닝 팁이 아니라, 성능 병목을 “언어 + 하드웨어 + 실행환경”의 상호작용으로 분석하는 시각을 길러줍니다. 테스트 도구의 사용법보다는 문제를 해석하고 대응하는 사고방식에 집중한다는 점이 특히 인상 깊었습니다.

 

중반부(4~6장)에서는 자바가 가진 ‘무거움’의 근본 원인을 해결하기 위한 방법으로 GraalVM 네이티브 이미지와 AOT 컴파일을 깊이 있게 다룹니다. 단순한 실습서가 아닌, 설정 오류나 리플렉션 누락 등 실제 실무에서 마주칠 수 있는 문제들을 직접 짚고 해결해나가는 방식은, 마치 현업 컨설팅을 받는 듯한 생생함이 있습니다. 특히 --no-fallback, resource-config.json, 초기화 시점 조정 같은 실전 팁은 GraalVM 도입을 고민 중인 개발자에게 실질적인 도움이 될 것입니다.

 

후반부(8~10장)는 컨테이너 환경에서의 자바 운영, 즉 관측 가능성(Observability) 확보에 초점을 맞춥니다. 지표, 로그, 추적의 3요소를 어떻게 조합해 문제를 진단하고 조치로 연결할 수 있을지를 실제 사례와 함께 설명합니다. 단순히 도구 설명을 넘어 “이상 징후를 미리 감지하려면 어떤 흐름을 따라야 하는가?”라는 관점은 운영과 개발을 아우르는 시사점을 줍니다.

 

마지막 장(5장)은 자바의 미래—가상 스레드(Project Loom), 외부 메모리 및 함수 연동(Project Panama), 값 타입과 메모리 모델(Project Valhalla)—에 대한 기대와 도전 과제를 소개합니다. 특히 가상 스레드는 고병렬 환경에서 기존 플랫폼 스레드의 한계를 넘는 방식으로 자바의 동시성 모델을 근본적으로 변화시킬 가능성을 보여주며, StructuredConcurrency나 Carrier Thread 등의 신개념도 실무 맥락에서 접근해 볼 수 있게 정리되어 있습니다.


이 책은 단순한 자바 튜닝 매뉴얼이 아닙니다. 오히려 “성능 문제를 어떻게 바라보고, 어떤 흐름으로 접근할 것인가”에 대한 철학적 태도와 구체적 실천을 동시에 담은 기술서입니다. 자바 개발자로서 성능 병목을 겪어본 적이 있다면, 혹은 “내 코드가 왜 느린지 설명하기 어려웠던” 경험이 있다면 이 책은 강력한 통찰을 제공해 줄 것입니다.

 

**한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.**

? 한빛미디어 서평단 <나는 리뷰어다> 활동을 위해서 책을 협찬받아 작성된 서평입니다.

 
 

 

『자바 최적화 2판』은 자바 애플리케이션의 성능을 과학적으로 분석하고, 클라우드 네이티브 환경에서 자바를 효과적으로 활용하는 실전적인 최적화 전략을 다루는 책이다. 단순히 JVM 이론이나 내부 구조 설명에 그치지 않고, 실제 코드와 다양한 사례를 통해 성능 튜닝의 원리와 실천 방안을 구체적으로 제시한다.

특히 2판에서는 클라우드 환경에서의 자바 성능 최적화, 관측성(Observability), 프로파일링, 동시성, 분산 시스템 패턴 등 현대 자바 개발자가 반드시 알아야 할 주제를 폭넓게 다룬다. 실무에서 바로 적용 가능한 팁과 레시피, 최신 트렌드가 잘 정리되어 있어 현장 개발자에게 실질적인 도움이 된다.

 

 

 

이 책은 다음과 같은 내용들을 담고 있다.

 

성능 튜닝의 과학적 접근

성능 튜닝을 감이나 소문에 의존하지 않고, 실험과 데이터 기반으로 접근해야 한다는 점을 강조한다. 성능 테스트 방법론, 통계 해석, 안티 패턴 등 실무에서 자주 마주치는 문제를 체계적으로 분석한다.

 

JVM과 하드웨어, 운영체제의 상호작용

JVM의 메모리 관리, 가비지 컬렉션(GC), JIT 컴파일러, 스레딩 모델 등 내부 구조를 깊이 있게 설명한다. 더불어, 자바가 하드웨어와 운영체제 위에서 어떻게 동작하는지, 가상화 및 컨테이너 환경에서 어떤 점을 주의해야 하는지도 다룬다.

 

클라우드 네이티브 환경의 최적화 전략

클라우드 환경에서의 배포, 관측성, 리소스 한계 설정, 블루/그린 배포 등 실전적인 최적화 전략을 소개한다. 마이크로미터, 프로메테우스, 오픈텔레메트리 등 최신 모니터링 도구 활용법도 다룬다.

 

동시성과 분산 시스템 패턴

병렬 처리, 자바 메모리 모델, 가상 스레드, 분산 데이터 구조, 합의 프로토콜 등 고급 주제를 폭넓게 설명한다. 현대 자바의 동시성 패턴과 미래 방향성까지 제시한다.

 

실용적이고 구체적인 지침

각 장마다 실제 코드 예제와 실무에서 바로 적용 가능한 팁, 성능 개선 레시피가 풍부하다. 마이크로벤치마킹, 프로파일링, GC 로그 분석 등 실전에서 유용한 도구와 기법을 상세히 안내한다.

 

 

 

자바 입문자거나 기초 지식이 없는 경우, 먼저 기본서를 읽고 접근하는 것이 좋다.

하지만 중급 이상의 개발자라면 자바의 기본 문법을 넘어, 성능 최적화와 실무적인 문제 해결에 관심이 있는 개발자에게 강력히 추천한다. 단순한 이론서가 아니라, 실무에서 겪는 다양한 성능 이슈를 과학적으로 분석하고 해결하는 방법을 배울 수 있다.

클라우드/분산 환경 실무자에게는 클라우드 네이티브, 마이크로서비스, 컨테이너 기반 환경에서 자바 애플리케이션을 운영하는 개발자라면, 이 책의 최신 트렌드와 실전 노하우가 큰 도움이 된다.

JVM과 자바 구조에 관심 있는 개발자라면, JVM, GC, JIT 등 자바 내부 동작 원리를 깊이 이해하고 싶은 개발자에게도 적합하다. 내부 구조와 최적화 기법을 체계적으로 익힐 수 있다.

 

『자바 최적화 2판』은 자바 성능 튜닝의 과학적 접근, JVM과 클라우드 환경의 실무적 이해, 그리고 최신 도구와 트렌드까지 아우르는 실전 지침서다. 자바 개발자로서 한 단계 더 성장하고 싶다면 반드시 읽어볼 만한 책이다. 실무에서 성능 이슈로 고민하는 개발자, 클라우드 환경에서 자바를 다루는 엔지니어 모두에게 강력히 추천한다.

한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.

사실 제목이 최적화여서 선입견이 있었다.

실제로 자바 애플리케이션에 대한 튜닝 포인트를 집어주고,

이런 부분을 이런식으로 수정하면 이렇게 드라마틱하게 변한다는 그래프를 보여주는 책이고 생각했다.

뭐. 거의 틀린 생각 이었다.

자바의 기본 문법을 다루거나 하지는 않지만,

개발 및 운영시 알아야 하는 기본적인 지식들을 다룬다.

세부적인 팁보다는 전반적으로 알아야할 내용들을 다루고 있어서,

자바의 버전업이 된다고 쓸모없는 지식이 되지는 않는 형태이다.

최근 회사 인턴을 뽑으면서 인터뷰를 진행했는데,

이 책에서 나온 JVM의 기본적인 사항이나 GC에 대한 것은 단골 질문이다.

(java 개발자라고 지원했는데, C와 같은 컴파일 언어의 내용을 말한 분도 있었다.)

아마 취준생들은 한 번쯤 읽어 봐야 할 책이라고 생각한다.

또한 세상이 클라우드로 바뀌다 보니, 클라우드에서의 차이점이나 관측을 위한 오픈텔레메트리도 다루고 있어서

한권의 책으로 폭넓게 자바를 다룬다.

미세 조정의 팁을 원하는 분들에게는 미흡하다고 생각할지 모르지만,

최적화를 위해 다루고 개발자가 기본적으로 알아야 할 것들을 넓게 다루는 좋은 책인 것 같다.

 

주변의 개발자들을 지켜보면 다양한 유형의 개발자들이 있는 것  같다. 그리고 개발에 대한 생각도 다르고 개발하는 방법도 다양한 것 같다. 하지만 많은 개발자들에게서 느끼는 부분중의 하나가 개발 이후 성능적인 부분이나 최적화에 대한 부분인 것 같다. 분명 요구되는 기능에 대한 개발은 잘 하는 것 같은데 성능적인 문제에 접했을 때 제대로 대응하지 못하고 헤매는 것을 종종 보게 되는 것 같다. 이는 경험 부족도 어느 정도 영향을 주겠지만 근본적으로 이에 대한 기본적인 지식을 제대로 습득하지 못한 경우가 많은 것 같다. 특히 개발환경마다 다르겠지만 성능 모니터링아나 튜팅을 위한 무료 도구들도 많이 있는데 이를 적절히 활요하지 못하는 것 같다.

 

이 책은 자바에 국한되어 있지만 개념적으로는 다른 언어에서도 충분히 응용할만한 성능 튜닝에 대한 기술을 소개한다. 최적화 및 성능에 대한 정의로 부터 시작해서 성능테스트 방법론에 이르는 부분에서는 성능에 대한 기본적인 지식을 습득할 수 있도록 도와준다. 이후 자바에서 가장 중요한 부분중의 하나의 가상머신 및 가비지 컬렉션에 대해 설명하며, 뒤로 가면서 하드웨어와 운영시스템을 통해 성능을 언급할 때 피할 수 없는 하드웨어적인 부분을 말하고 있다. 이후 클라우드에서 자바를 최적화하고 배포하는 방법을 설명함으로서 최종적으로 클라우드 환경에서 자바를 운영하면서 생길 수 있는 고려사항들을 소개하고 있다. 고급 기술로서 프로파일링 및 동시성 성능 측정, 분산시스템 기법등 앞부분에서 소개한 다양한 개념을 응용하거나 한층 더 깊이있게 파악할 수 있는 기법들을 보여주고 있다. 특히 부록에서 설명하는 마이크로벤치마킹이나 성능 안티패턴은 책을 마무리하면서 생각해볼 만한 다양한 고려사항을 보여준다.

 

성능 튜닝을 어렵게만 생각할 문제가 아니라 언어의 특성을 이해하고 환경을 고려하고 다양한 도구들을 활용한다면 생각보다 수월하게 접근하고 해결방안을 찾을 수 있는 문제라고 생각이 든다.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬받아 작성된 서평입니다

 

대상 독자

 자바 최적화(2판) 단순한 코드 튜닝 가이드가 아니라 성능 테스트, JVM 구조, 애플리케이션 운영까지 폭넓게 다루는 책이었습니다.  개정판에서는 다음 네 가지 주제를 중심으로 구성되어 있습니다. 

① 단일 JVM에서 실행되는 코드 성능 분석

② JVM의 내부 매커니즘에 대한 심층 설명

③ 클라우드 스택과 JVM 애플리케이션 간의 상호작용

④ 클러스터 환경에서 자바 애플리케이션이 어떻게 동작하는지에 대한 고찰

 

이 책은 자바 언어에 익숙한 개발자는 물론, 인프라 환경을 설계하거나 운영해본 경험이 있는 독자에게 유익하다고 생각합니다. 시스템 자원 활용, GC 튜닝, 벤치마크 분석 등 성능 최적화 전반에 대해 실무에 바로 적용 가능한 통찰을 제공하며, 단순한 문법 지식을 넘어 성능 엔지니어링 관점에서 인사이트를 얻고자 하는 분께 추천합니다.

 

리뷰

 자바 최적화(2판)은 단순한 코드 튜닝을 넘어 JVM 내부 구조, 성능 테스트 방법론, 클라우드 환경에서의 운영까지 폭넓게 다루는 책입니다. 자바 개발자로서 실무와 자기개발을 병행하며 이론으로 간단히 접했던 GC, 스레드, JIT 컴파일 등의 개념들을 체계적으로 정리하고 이해하는 데 큰 도움이 되었습니다. 

 

특히 성능을 실증 과학으로 접근해야 한다는 관점, 인지적 편향이나 잘못된 테스트 관행을 짚는 내용은 실무에서 겪은 시행착오와 맞닿아 있어 인상 깊었습니다. 이후 챕터에서는 도커, 클라우드, 관측성 등 인프라 관점의 주제도 다루며 시야를 확장해줍니다. 

 

기계적 공감(mechanical sympathy)’이라는 태도를 갖고 시스템을 깊이 이해하려 하거나 성능 최적화에 관심있는 자바 개발자라면 새로운 인사이트를 얻는 계기가 될 것입니다.

 

 

한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.

시작하기 전에...

? 이 책을 어떻게 리뷰하면 좋을까?

 

이 책에 담긴 내용이 너무나 소중해서 어떻게 다루어야할지 고민을 정말 많이 했다. G1 / Shenandoah / ZGC / Balanced 등 고급 GC의 원리와 활용 방법을 바로 다루자니 비교적 마이너한 분야라 처음 접하시는 분들이 읽기에는 피로도가 높을 것 같았고, 반대로 애플리케이션 관측성과 클라우드 배포를 실습하자니 제품 활용에 대한 내용이 많아 이 책의 진가를 보여줄 수 없을 것 같았다. 그래서 고민 끝에 Java 성능 향상을 위해 하드웨어에 대한 기계적 공감이 얼마나 중요한지를 핵심 주제로 정했다. 물론 글의 흐름에도 신경썼다. 하드웨어에 대한 내용은 동시성에 대한 상세 내용 자체는 7장에서 30페이지 이하로 짧게 작성되었지만, 나는 이 짧은 내용조차 책 전반에 걸쳐 얼마나 깊이 있게 이해할 수 있는지를 전달하고 싶었다. 따라서, 7장에만 국한되지 않고 필요하다면 이전/이후 장의 내용들을 유기적으로 짜깁기하여 저자의 의도가 파편화되지 않도록 보충했다. 각 문단 끝에 ? 이모지를 활용하여 작성 의도를 요약하였으니, 모든 내용을 읽기 어렵다면 이 부분만 가볍게 체크하고 넘어가면 된다.


자바 최적화 / 벤저민 에번스, 제임스 고프 지음 / 한빛미디어

1. 당신이 하드웨어에 관심을 가져야 하는 이유

트랜지스터는 더 이상 작아질 수 없는 한계에 도달했으며, 결국 물리학의 법칙이 장애물로 작용합니다. 현재 트랜지스터는 원자 단위로 측정할 수 있을 정도로 작아졌고, 상용화된 가장 작은 트랜지스터의 너비는 3nm에 불과합니다. 이는 인간 DNA 한 가닥(약 2.5nm)보다 약간 더 넓은 수준입니다.
2021년, IBM은 2nm 칩을 성공적으로 개발했다고 발표했지만, 이제 이러한 발전은 비용이 과도하게 증가하고 진행 속도가 매우 느려졌습니다. 따라서 안정적인 성능 향상이 가능할지 의문이 제기되고 있습니다. 또한, 현재 재료 물리학의 한계를 고려하면 원자보다 얇은 전선을 만들 수는 없습니다.
─ Audrey Woods, 'The Death of Moore’s Law'

 

지난 수십년 간, 소프트웨어 성능은 하드웨어의 발전이 가져다주는 혜택 아래에서 쉽게 개선되어 왔다. 흔히 말하는 스케일 업(scale-up)을 통해 서버의 스펙을 높이면 처리량도 그에 비례하여 올라갔다. 그러나 어느 순간부터 스케일 업은 한계를 마주하게 된다. 하드웨어의 양적 개선만으로는 다양한 병목을 해결할 수 없었고, 하드웨어의 발전도 예전 같지 않았기 때문. 물론 예나 지금이나 한결 같이 개선의 한계를 토로했음에도 기술은 끊임없이 발전해왔다. 그러나 그 속도는 예전 같지 않음에 동의하지 않을 사람은 없다. 반도체 집적회로의 성능이 24개월마다 2배로 증가한다는 무어의 법칙(Moore's law)도, 이제는 무어의 제2법칙에서 48개월로 늘어났다.

 

따라서 현대 컴퓨터에서는 자연스럽게 한정된 트랜지스터를 효율적으로 활용하기 위한 고도화가 진행되었다. 예전에는 단순 스케일 업으로 향상되었던 하드웨어 성능도, 이젠 기술적/경제적 이유로 인해 구조적 개선이 불가피하다는 뜻이다. 그렇다면 소프트웨어는 어떨까? 소프트웨어 프레임워크도 이에 발맞춰 개선하다보니 복잡성이 증가했다. 정리하자면 결과적으로 컴퓨팅 성능 자체는 분명 향상되었지만, 소프트웨어 엔지니어가 이 혜택을 모두 누리기 위해 알아야 할 지식과 수행해야 할 작업들이 예전에 비해 점점 더 복잡해지고 있다는 것이다.

 

? 단순 스케일 업 기반의 성능 향상은 한계에 도달했다. 이제 소프트웨어 엔지니어들은 현대 하드웨어의 개선 방향성과 이를 기반으로 최적화된 언어 및 프레임워크의 동작을 이해해야만 최고 수준의 성능 최적화에 도달할 수 있다.

 

? The Death of Moore’s Law: What it means and what might fill the gap going forward
The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software


2. 지금 당장 하드웨어를 활용해야 하는 이유

JVM (Java Virtual Machine)

당신이 자바 가상 머신(JVM)을 활용하는 소프트웨어*를 개발하고 있다면, JVM이 멀티 코어 프로세서에 최적화된 방식으로 동작한다는 사실을 명심해야 한다. JIT 컴파일러(Just-in-time Compiler), 그리고 프로덕션 환경에서 사용하는 현대의 GC(Garbage Collection) 모두 해당된다. 당신이 작성한 애플리케이션이 싱글 스레드에 Blocking 방식으로 동작하든, 멀티 스레드에 Non-blocking 방식으로 동작하든 상관 없다. 현대의 자바 실행 환경은 멀티 코어 환경에 최적화됐다. 그럼에도 2022년 Relic의 조사에 따르면, 자바 애플리케이션의 70% 이상이 컨테이너 환경에 배포되고 있었으며, 그 중 약 절반은 1 vCPU 이하로 제한된 상태에서 실행되고 있었다.

Relic - 2022 State of the Java Ecosystem

 

이것은 결코 사소하지 않다. 레드햇과 마이크로소프트의 연구 결과에 따르면, 자바 애플리케이션을 컨테이너화할 때 다수의 단일 코어 컨테이너보다 소수의 멀티 코어 컨테이너에서 실행하는 것이 일반적으로 더 유리한 것으로 나타났다. 이러한 싱글 코어 제약은 JVM이 Serial 또는 SerialOld 컬렉터를 선택하도록 만들고 GC가 직렬로 실행되도록 만들어, 일시 정지 시간이 길어지고 처리량이 줄어들며 애플리케이션이 더 빈번하게 중단되는 문제를 야기한다. 그래도 이듬해 23년 Relic의 조사 결과에서는 이런 케이스가 5%p 가량 감소했다.

Java 11과 17에서 CPU 2개 이상, 메모리 2GB 이상이 아니라면 Serial GC가 선택된다

 

? 기본적인 GC 최적화도 제대로 이루어지지 않고 있는 것이 현실이다. 복잡한 튜닝 없이 기본 원칙을 지키는 것만으로 애플리케이션 성능이 배가 된다면... 하지 않을 이유가?

 

* Java로 언어를 특정하지 않은 이유는 JVM은 유효한 클래스 파일을 생성할 수 있는 모든 언어에 호환되기 때문이다. 일례로 Kotlin, Groovy, Scala, Clojure 등이 생성하는 바이트코드는 모두 JVM 위에서 실행 가능하다.

 

? 2022 State of the Java Ecosystem / 2023 State of the Java Ecosystem

? Best practices for Java in single-core containers


 

앞선 멀티 코어 프로세서 사례를 통해 성능 최적화를 하드웨어 영역에서 바라보는 것이 왜 중요한지, 실증적인 문제 인식은 충분히 되었을거라 믿는다. 물론 전력 효율이나 메모리 최소화 등의 특수한 경우에는 싱글 코어 환경이 적합할 수도 있지만, 우리는 지금 일반적인 얘기를 하고 있다. 문제는 단순히 안티 패턴을 교정하는 수준이 아니라, 성능 최적화를 위한 파인 튜닝이 필요할 때다. 안타깝게도 이를 위한 은탄환은 없다. 따라서, 다음 단계는 런타임동안 JVM이 어떻게 동작하는지 이해하고, 가설을 세운 뒤 이를 검증하는 것이다. 이러한 관점에서 JIT 컴파일러와 GC는 학습을 위한 좋은 출발점이다. C1, C2 계층적 컴파일, 메서드 캐시와 코드 캐시, 분기 예측과 추측 실행, AOT 컴파일과 PGO 등 처리 속도 관점에서 학습하고, 클래식 GC부터 G1, 섀넌도어의 구조와 동작 방식 등 런타임 상태 분석 관점에서 학습해볼 수 있다.

JVM 이해를 돕는 다양한 도식들


3. 자바 메모리 모델이 중요한 이유

'갑자기 메모리?' 라고 생각했다면 주목. 앞선 두 문단에 걸쳐 나는 하드웨어 자체의 발전 속도에는 제동이 걸렸으니, 이제는 보다 자원을 똑똑하게 활용해야 할 때라는 메세지를 전달하고 싶었다. 이러한 관점에서 동시성 프로그래밍을 활용하는 것이야말로 시스템 자원을 똑똑하게 활용하는 방법 중 하나라는 데에 이의를 가진 독자는 없을거라 생각한다. 또한 이 글 전반에 걸쳐 강조하고 싶은 내용은 코드 레벨 외에도 JVM의 동작을 이해하는 것으로 가능한 최적화가 있다는 사실이다. 중요하게 생각하는 동시성 프로그래밍과 JVM, 둘 사이의 교집합으로 JMM이 존재하기에 강조하고자 했으며, 이를 보다 깊이있게 전달하기 위해 컴퓨터 구조가 어떻게 개선되어 왔는지부터 간단히 짚고 넘어가도록 하겠다.


CPU 발전과 캐시의 도입

CPU는 계속 발전해왔다. 무어의 법칙 아래 트랜지스터 수는 기하급수적으로 증가했고, 클럭 속도도 따라서 상승했다. 문제는 데이터였다. 데이터가 다음 클럭에 바로 로드되지 않아(hazard) CPU가 정지(stall)하는 상황이 빈번해졌다.* 정리하자면 메모리에 병목이 걸려 전체 성능이 메모리 성능 수준에 머물게 되는 것이다.

연도별 프로세서-메모리 성능. 차이가 커질수록 데이터 로드 지연에 따른 연산 효율은 감소한다.

 

이러한 현상은 '폰 노이만 병목'으로도 불리며, 폰 노이만 컴퓨터 구조에서 명령어와 데이터가 동일한 버스를 공유하기 때문에 발생한다. CPU 캐시이를 완화하기 위한 방법 중 하나로 도입되었다. 핵심 컨셉은 자주 접근하는 메모리의 위치와 값을 근처에 복사해두고 사용해서 최대한 주 메모리 참조 횟수를 줄이는 것. 프로세서 아키텍처에 따라 캐시의 수와 구성에 다소 차이가 있지만, 일반적으로 L1과 L2는 각 코어 내부에, L3는 여러 코어가 공유하도록 구성되어 있다. 이 결과로 소프트웨어의 성능은 참조 데이터의 지역성 수준 정도로 이전보다 수십 배 빨라질 수 있게 되었다.

 

* 물론 단순 대기(stall) 외에도 이러한 비효율을 방지하기 위한 다양한 개선책operand forwarding, scoreboarding, Tomasulo algorithm이 존재한다. 하지만 여기서는 캐싱을 통한 구조적 개선만 다룬다.

캐시가 만든 새로운 문제들

그렇게 문제가 사라졌다면 좋았겠지만, 안타깝게도 멀티 코어 시스템에서는 또 다른 문제들이 발생했다. 각 CPU 코어가 데이터를 캐시에 저장하고 독립적으로 처리하다 보니, 동일한 메모리 위치에 대해 서로 다른 값을 갖는 상황이 발생했다. 이미 로드한 값을 주 메모리 참조 없이 재사용하는 것이 성능 향상의 핵심이라면, 다른 프로세서에서 주 메모리 값을 수정해야 한다면 어떻게 처리해야 할까? Write-through? Write-back? MESI 프로토콜은 또 뭐지? 또 여러 CPU가 동일한 메모리 위치를 어떻게 일관되게 접근할 수 있을까? 강한 메모리 모델과 캐시 무효화 알림? 약한 메모리 모델?  분명 x86 아키텍처에서 volatile 키워드 제대로 동작했는데, 왜 ARM에서는 결과가 이상하지? Race condition? Stall? Reordering? Operand Forwarding? ... ? 소프트웨어 개발은 언제 하지? 하지만 이러한 하드웨어 수준의 문제를 소프트웨어 개발자가 매번 신경 써야 한다면, 개발의 복잡도는 감당할 수 없는 수준이 된다. 이러한 문제를 해결하기 위해 하드웨어 수준의 문제들이 소프트웨어로 전파되지 않도록 고안된 추상화 계층, 자바 메모리 모델(JMM)이 등장했다.

자바 메모리 모델(JMM)

JMM은 복잡한 하드웨어 현실과 소프트웨어 세계를 격리시키기 위해 프로그래밍 모델로 추상화된 규약이다. 그러니까 JVM이 준수해야 하는 일종의 표준 계약(요구사항)인 셈이다. JSR-133을 보면 가시성(visibility), 원자성(atomicity), 순서 매기기(ordering) 등의 용어들과 synchronized, volatile, final과 같은 키워드들의 의미를 'happens-before' 관계를 중심으로 표준화했다. 실제로 문제를 해결하는 주체는 JVM 구현체이지만, 그 어떤 JVM도 JMM의 premise를 어길 수 없다는 사실은 이해하는 것은 스레드 간 공유 상태의 격리 수준을 최소화하는데 중요하다. 예를 들면, synchronized는 상호 배제와 happens-before 동시에 보장하는데, 대부분의 경우 이는 필요 이상의 과도한 오버헤드를 발생시킨다. 가령, boolean형 클래스 변수의 할당 연산을 동기화한다면 가시성만 보장하는 volatile의 사용을 고려해볼 수 있다. 즉, JMM에 대한 이해는 정확성과 성능 사이의 균형점을 찾기 위한 기초 지식이다. JVM 구현체는 하드웨어와의 접점에서 JMM을 준수하도록 설계되어 있고, 개발자는 이를 활용하여 정교한 동시성 설계와 최적화를 구현할 수 있다.

JSR-133: JMM은 주어진 프로그램의 실행 트레이스가 해당 프로그램 기준에서 '적법'한지 판별한다.

 

? 하드웨어의 구조적 특징이 동시성 프로그래밍에서 어떤 문제를 야기할 수 있는지 이해해야 한다. JMM이 도입된 이유에 공감하고, 'happens-before' 기반의 premise를 이해한다면 보다 깊이 있는 최적화가 가능해진다.

 

JSR-133: JavaTM Memory Model and Thread Specification

The JSR-133 Cookbook for Compiler Writers

Close Encounters of The Java Memory Model Kind


4. 마치며...

현대의 자바 개발자들은 거대한 추상화의 혜택 위에 있다. 너무 익숙해져서 그 사실을 간과하고 있는 걸지도 모른다. 분명 성능 최적화는 첨단의 영역이지만, 그 내공은 컴퓨터 과학의 기본기에서 나온다는 것을 잊어서는 안 되겠다. 또 하드웨어를 포함한 소프트웨어의 실행 환경을 이해하는 것이 개발자에게 얼마나 큰 지평을 열어주는지 새삼 체감하게 된 시간이었다.

 

이렇듯 담고 있는 내용도 좋았지만, 이 책의 구성과 표현도 흥미로웠다. Java가 어떤 문제를 어떻게 해결해왔는지, 그 흐름을 쉽게 따라갈 수 있도록 도와준다. 서로 다른 영역의 내용들이 '성능 최적화'라는 주제를 중심으로 유기적으로 연결되어 있었고, 서사에 부여된 연역적인 연속성이 흥미를 돋워 처음 읽었을 때와 반복해서 읽었을 때의 느낌이 달라 정말 재밌었다.

 

이외에는 책이 컬러로 인쇄되어 코드를 포함하여 책의 가독성이 매우 좋고, 각주로 포함된 링크도 많아 깊게 파고들기 수월했다. 이 책의 단점은 가끔 오역인 것 같은 부분이 있다는 점 ─ 가령, CPU에서 다음 클럭에 데이터가 로드되지 않았으면 stall 상태가 되는데, 이를 유휴 상태로 표현하는 것은 적절하지 않은 것 같다. ─ 그리고 잘 읽다보면 책에 오타가 꽤 많고, 어떤 링크들은 접속할 수 없다는 점이다.

 

마지막으로 다시 한 번 강조하지만 이 책이 내용은 어려워도, 신기하게 정말 쉽게 읽힌다. 경력 관계 없이 자바 개발자라면 반드시 읽는 것을 추천한다.

 

* 이 책 외에도 다음과 같은 레드햇 자료들을 참고하면 더 많은 인사이트를 얻을 수 있다.

결제하기
• 문화비 소득공제 가능
• 배송료 : 2,000원배송료란?

배송료 안내

  • 20,000원 이상 구매시 도서 배송 무료
  • 브론즈, 실버, 골드회원 무료배송
닫기

리뷰쓰기

닫기
* 상품명 :
자바 최적화(2판)
* 제목 :
* 별점평가
* 내용 :

* 리뷰 작성시 유의사항

글이나 이미지/사진 저작권 등 다른 사람의 권리를 침해하거나 명예를 훼손하는 게시물은 이용약관 및 관련법률에 의해 제재를 받을 수 있습니다.

1. 특히 뉴스/언론사 기사를 전문 또는 부분적으로 '허락없이' 갖고 와서는 안됩니다 (출처를 밝히는 경우에도 안됨).
2. 저작권자의 허락을 받지 않은 콘텐츠의 무단 사용은 저작권자의 권리를 침해하는 행위로, 이에 대한 법적 책임을 지게 될 수 있습니다.

오탈자 등록

닫기
* 도서명 :
자바 최적화(2판)
* 구분 :
* 상품 버전
종이책 PDF ePub
* 페이지 :
* 위치정보 :
* 내용 :

도서 인증

닫기
도서명*
자바 최적화(2판)
구입처*
구입일*
부가기호*
부가기호 안내

* 온라인 또는 오프라인 서점에서 구입한 도서를 인증하면 마일리지 500점을 드립니다.

* 도서인증은 일 3권, 월 10권, 년 50권으로 제한되며 절판도서, eBook 등 일부 도서는 인증이 제한됩니다.

* 구입하지 않고, 허위로 도서 인증을 한 것으로 판단되면 웹사이트 이용이 제한될 수 있습니다.

닫기

해당 상품을 장바구니에 담았습니다.이미 장바구니에 추가된 상품입니다.
장바구니로 이동하시겠습니까?