원문: Real differences between “java -server” and “java -client”?
JDK는 VM의 클라이언트 쪽 제공과 서버 응용프로그램을 위해 조절된 VM이라는 두 가지 특징을 포함한다. 이 두 해결책은 자바 핫스판 런타임 환경의 코드 기반을 공유하지만, 클라이언트과 서버의 뚜렷하게 독특한 성능 특징에 맞춰진 다른 컴파일러들을 사용한다.
서버와 클라이언트 VM이 유사함에도 불구하고, 서버 VM은 특별히 동작 속도의 최대치를 극대화할 수 있도록 조절되었다. 그것은 오래 수행되는 서버 응용프로그램들을 실행시키기 위해서이며, 그런 응용프로그램은 빠른 스타트업 시간이나 작은 런타임 메모리 풋프린트(크기)보다는 가장 빠른 동작 속도를 필요로 한다.
클라이언트 VM 컴파일러는 클래식 VM과 JIT 컴파일러 모두를 위한 업그레이드로 쓰인다. 클라이언트 VM은 애플리케이션과 애플릿을 위해 향상된 런타임 성능을 제공한다. 자바 핫스팟 클라이언트 VM은 응용프로그램의 스타트업 시간과 메모리 풋프린트를 줄이려고 특별히 조절되어 있고, 클라이언트 환경에 특히 잘 갖춰져 있다. 일반적으로 GUI를 위해서는 클라이언트 시스템이 더 낫다.
그래서 진짜 차이는 컴파일러 수준에도 존재하는데…
클라이언트 VM 컴파일러는 서버 VM의 컴파일러에 의해 수행되는 보다 복잡한 최적화의 많은 부분을 수행하려고 시도하지 않는다. 하지만 대신에 코드 조각을 분석하고 컴파일하는 데 더 적은 시간이 필요하다. 이것은 클라이언트 VM이 더 빨리 시작하고 더 적은 메모리 풋프린트를 요구한다는 것을 의미한다.
서버 VM은 C++ 컴파일러를 최적화함으로써 수행되는 같은 동일한 종류의 최적화 및 전통적인 컴파일러에 의해 수행될 수 없는, 가상 메쏘드 호출을 넘어서는 공격적인 인라이닝같은 몇가지 최적화의 다수를 제공하는 고급 적응 컴파일러를 포함한다. 이것은 경쟁력있고 정적 컴파일러 대비 성능 상 우위를 가진다. 적응 최적화 기술은 그 접근에 있어서 매우 유연하며 전형적으로는 심지어 고급 정적 분석과 컴파일 기술의 성능을 넘어선다.