자바 초창기에 메서드 디스패칭 성능은 정말 최악이었기 때문에, 메서드를 잘게 나누지 말고 하나의 덩치 큰 메서드로 작성하는게 좋다고 권고하는 개발자가 있었다. 하지만, 최신 자바 가상 머신 (Java Virtual Machine)에서는 자동 인라이닝을 지원하기 때문에 '모든 코드를 한 메서드에 욱여넣어라' 라는 말은 JIT 컴파일러와 어울리지 않는 퇴물이 되었다.
모든 최적화 기법에는 개발자가 사용하기 전에 알아야 할 함정과 트레이드 오프가 도사리고 있으니 조심해야 한다. 아래의 내용을 명심하자.
자바는 블루 칼라(주로 생산직에 종사하는 육체 노동자) 언어입니다. 박사 학위 논문 주제가 아니라 일을 하려고 만든 언어죠.
자바는 처음부터 아주 실용적인 언어이다. 개발 생산성이 높아지면 성능 희생은 감수할 만하다는 입장이다.
서브시스템(managed subsystem)이 가장 대표적인 예이다. 가비지 수집 서브 시스템으로 개발자는 메모리를 의식할 필요 없이 개발을 할 수 있다.
이러한 자바의 시스템 때문에 자바는 런타임 동작이 복잡하고, 이를 측정하는 데에도 기초 통계 기법만 가지고는 분석하기 어렵다. 그리고 필자는 자바 성능 측정값 때문에 판단이 흐려지기 쉬우므로 조심해야 한다고 당부한다.
JVM 성능 튜닝의 목표는 시스템 유저가 추구하는 측정 결과를 얻는 것이다. 아래의 원칙을 기억하자.
즉, 적량적인 일련의 목표가 수립되어야 한다.
기본적인 JVM 성능 지표에 대해서 알아보자.
위의 성능 측정값은 어떤 식으로든 서로 연결되어 있어 서로 영향을 준다.
아래 그래프는 부하가 증가하면서 예기치 않게 저하가 일어난 그래프로, 성능 엘보(performance elbow)라고 한다.
이를 해결하기 위해 클러스터 장비를 추가하면 선형적으로 문제를 해결할 것 같지만, 실제로는 그렇지 않다. 암달의 법칙(Amdal's Law)에 의하면 프로세스 개수에 대한 시간 단축 그래프는 아래와 같다.