주제: JVM, GC가 뭐고 — 왜 자바로 개발하냐?
Java Virual Machine은 자바 바이트코드(.class)를 운영체제/CPU와 상관없이 실행해 주는 가상 컴퓨터.
내 노트북이든 EC2리눅스든 같은 .jar를 돌릴 수 있게 해 주는 번역기+실행기
바이트코드 실행
자바 코드를 .java → javac 컴파일 → .class 바이트코드
JVM은 이 바이트코드를 읽어서 OS/CPU가 이해할 수 있는 명령으로 변환
메모리 관리
JVM은 프로그램 실행에 필요한 메모리를 나눠서 관리
Heap 영역: 객체 저장
Stack 영역: 메서드 호출, 지역변수 저장
Method 영역: 클래스 코드, 메서드, 상수 저장
MyCode.java ──(javac 컴파일)──> MyCode.class(바이트코드)
↓
JVM이 읽음
[클래스 로더] → [실행 엔진(인터프리터+JIT)] → [OS/CPU]
│
[메모리 관리(GC)]
JVM 안의 핵심 부품(이름 정도만 기억하자)
.class 파일을 JVM메모리로 적재
포인트
- 스택=짧고 빠름
- 힙=객체가 모여 사는 곳
- GC=힙 청소부
GC는 더 이상 쓰지 않는 객체(어느 곳에서도 참조하지 않음)를 자동으로 찾아서 힙에서 채워주는 기능
메모리 안정성, 개발속도가 향상된다.
“GC 루트(실행 중인 스레드 스택, static 변수 등)”에서 닿을 수 없는 객체는 쓰레기다 → 청소
청소할 때는 잠깐 stop-the-world(모든 스레드 멈춤) 구간이 꼭 생김
세대별(Generational) GC:
Young(금방 생긴 객체; 금방 죽음) / Old(오래 사는 객체)로 나눠 효율적으로 청소
Serial/Parallel: 옛날 방식, 단순/스루풋 지향
G1 GC: 요즘 기본값(자바 9+ 핫스팟)—적당히 빠르고 멈춤시간 짧게 만들려고 고안됨
ZGC / Shenandoah: 아주 짧은 멈춤시간이 필요할 때(고급/특수 상황)
현업 기본값: 그냥 G1 쓰고 힙 크기만 맞추면 90%는 충분합니다.
한 번 빌드하면 어디서나 실행(JVM 덕분) — 윈도우/리눅스/ECS/EC2 가리지 않음
GC로 메모리 안전성 확보 — 메모리 해제 실수로 뻗을 일이 적음
성능 안정성 — JIT로 뜨거워질수록 빠름, 서버에서 충분히 고성능
거대한 생태계 — Spring Boot, Maven/Gradle, 라이브러리, 예제가 넘침
채용/학습 자료 풍부 — 팀 꾸리기, 유지보수, 문서, 커뮤니티가 매우 강함
장기 지원(LTS) — JDK 17/21 같은 장기 버전으로 안정적 운영
GC 멈춤이 아예 0은 아님(튜닝으로 줄임)
메모리 사용량이 비교적 큼
“처음 기동”이 스크립트 언어보다 느릴 수 있음(하지만 서버는 오래 떠 있음)
결론: 서비스를 오래, 안정적으로, 많은 사람이 협업해야 한다? → 자바/스프링은 매우 안전한 선택.