Java Virtual Machine

Write Once, Run Anywhere

Sun MicrosystemsJava 초기 마케팅 슬로건

"Write Once, Debug Everywhere." 결국 운영체제 마이너 버전 다르면 거기서 또 JVM 버그가 터진다

1. 개요

자바 코드를 컴파일하여 생성된 바이트코드를 실행하기 위한 가상 머신(Virtual Machine)이다. "Write Once, Run Anywhere"라는 슬로건답게 플랫폼 독립성을 선사하여 기업용 엔터프라이즈 시장과 안드로이드 생태계를 통째로 점령했다. 하지만 메모리 가상화와 동적 컴파일(JIT Compiler) 과정에서 발생하는 오버헤드와 기묘한 메모리 누수는 개발자들을 끊임없이 괴롭힌다.(...)

2. 가비지 컬렉터와의 끝없는 사투

JVM의 최대 강점은 개발자가 메모리를 직접 해제할 필요 없이 가비지 컬렉션(Garbage Collection)이 알아서 쓰레기 메모리를 청소해 준다는 점이다. 그러나 이 청소기가 가동되는 순간, JVM은 모든 애플리케이션 스레드를 강제로 정지시키는 Stop-The-World(STW) 현상을 일으킨다. 실시간 초저지연이 생명인 금융망이나 대규모 커머스 서버에서 STW가 수 초 동안 터지면 그야말로 억 소리 나는 대참사가 벌어진다. 이 때문에 대기업 백엔드 부서는 매년 수억 원을 들여 GC 튜닝에 목숨을 건다.1

3. 관련 밈 및 드립

3.1. Write Once, Debug Everywhere

JVM의 독립성을 찬양하는 공식 슬로건을 비틀어, 환경이 달라지면 어김없이 터져 나오는 클래스 패스 문제와 런타임 버전 불일치 에러를 까는 드립이다. 결국 로컬 개발 환경리눅스 서버 환경의 튜닝을 따로 해야 하는 현실을 반영했다.

3.2. Stop-The-World (자 월드야 멈춰라)

가비지 컬렉터가 힙 메모리를 대대적으로 정리하기 위해 온 세상을 멈춰 세울 때, 모니터링 화면 전체가 붉게 물들며 먹통이 되는 공포의 순간을 서부극의 한 장면처럼 묘사한 밈이다.(...)

4. 여담

  • 메모리 먹는 하마: JVM 기반 애플리케이션은 기동하는 순간 자체 런타임과 메타스페이스, 가상 힙 영역을 확보하기 때문에 최소 수백 MB의 램(RAM)을 우습게 집어삼킨다. 임베디드나 초소형 컨테이너 환경에서는 엄청난 단점이다.
  • JIT 컴파일러의 웜업: 자바 프로그램은 처음 실행할 때는 인터프리터 방식으로 느리게 동작하다가, 자주 실행되는 핫스폿(Hotspot) 코드를 기계어로 컴파일하는 웜업(Warm-up) 단계를 거쳐야 제 속도가 나온다. 서버 배포 직후에 요청이 몰려 서버가 뻗는 이유가 바로 이 때문이다.
  • 코틀린과 스칼라의 기생: 사실 자바 언어 자체보다 JVM이라는 든든한 런타임이 너무 강력해서, 코틀린이나 스칼라 같은 모던 언어들이 JVM 위에서 구동되는 방식으로 대성공을 거두었다.

5. 관련 문서

각주

  1. 최근에는 STW 시간을 밀리초 단위로 줄였다는 ZGC 같은 괴물들이 등장했으나, 설정이 까다롭고 CPU를 무지막지하게 퍼먹기 때문에 결국 자원 최적화라는 근본적인 숙제는 그대로 남았다.