본문 바로가기
📙/Study

[JVM 파헤치기] 01. 자바 기술 시스템 소개(1)

by kiwi_wiki 2025. 3. 17.
728x90
반응형

자바의 대표적인 특징

- 하드웨어 플랫폼이라는 족쇄를 제거하여 한 번 작성하면 어디서든 실행된다 라는 이상을 실현

- 안전한 메모리 관리 시스템을 갖춘 덕에 메모리 누수 문제와 엉뚱한 메모리를 가리키는 문제 대부분을 피할 수 있음

- 런타임에 핫 코드(빈번하게 실행되어 전체 성능에 영향을 크게 주는 코드)를 감지, 컴파일하고 최적화하여 자바 애플리케이션이 최상의 성능을 내도록 도와줌

- 표준 API 자체가 풍부할 뿐 아니라 수많은 기업과 오픈 소스 커뮤니티에서 제공하는 다양한 기능의 서드 파티 라이브러리를 활용할 수 있음

 

자바 기술 시스템

자바 가상 머신 위에서 동작하는 코틀린, 클로저(Clojure), JRuby, 그루비 등의 프로그래밍 언어와 그 외 관련된 자바 프로그램들도 자바 기술 시스템에 속하는 것으로 봄

자바 기술 시스템의 요소 

- 자바 프로그래밍 언어

- 다양한 하드웨어 플랫폼용 자바 가상 머신 구현

- 클래스 파일 포맷

- 자바 클래스 라이브러리 API(표준 API)

- 다른 기업과 오픈 소스 커뮤니티에서 제공하는 서드 파티 클래스 라이브러리

 

자바 기술 시스템의 구성 요소 (JDK 7)

JDK

- 자바 프로그래밍 언어 + 자바 가상 머신 + 자바 클래스 라이브러리

- 자바 프로그램 개발에 필요한 최소한의 환경

JRE

- 자바 SE API + 자바 가상 머신 + 배포 기술

- 자바 프로그램을 실행할 수 있는 표준 환경 제공

자바 기술 시스템 주요 제품군

- 자바 카드: 스마트카드와 같은 소현 기기 및 변조 방지 보안 칩 등에서 실행

- 자바 ME: 휴대 전화, PDA 같은 모바일 기기에서 실행

- 자바 SE: 데스크톱 애플리케이션용

- 자바 EE: 전사적 자원 관리(ERP), 경영 정보 시스템(MIS), 고객 관계 관리(CRM) 애플리케이션과 같은 다중 계층 구조로 이루어진 기업 규모 애플리케이션용

자바 JDK 타임라인

자바 기술 개발 타임라인

- 1991.04: 자바 언어의 시초 오크(Oak)

셋톱박스, 냉장고, 라디오 같은 다양한 가전제품에서 구동되는 프로그램을 개발하는 것이 목표

- 1995.05.23: Oak -> Java 이름 변경

썬월드(SunWorld) 콘퍼런스에서 자바 1.0 정식 데뷔

- 1996.01.23: JDK 1.0 출시

자바 가상 머신(썬 클래식 VM)은 순수한 인터프리트 방식 사용

대표 기술: 자바 가상 머신, 애프릿, AWT 등

- 1997.02.19: JDK 1.1 출시

대표 기술: JAR 파일 포맷, JDBC, 자바 빈스, RMI 등

문법 개선: 내부 클래스와 리플렉션 등장

- 1998.12.04: JDK 1.2 발표

썬은 자바 기술 시스템을 3개로 나눔(데스크톱 애플리케이션 중심 J2SE, 기업용 시스템 J2EE, 모바일 단말 J2ME)

대표 기술: EJB, 자바 플러그인, 자바 IDL, 스윙(Swing) 등

처음으로 JIT 컴파일러 탑재 (클래식 VM, 핫스팟 VM, 이그잭트 VM이라는 세 가지 가상 머진 공존)

문법: strictfp 키워드 추가, 컬랙션 API 등장

- 2000.05.08: JDK 1.3 출시

수학 연산과 새로운 타이머 API 등 자바 클래스 라이브러리 개선

확장 기능이던 JNDI 서비스가 플랫폼 수준 서비스로 제공되기 시작

CORBA 와 IIOP를 이용해 RMI 커뮤니케이션 프로토콜 구현

새로운 API도 많이 추가되고 JavaSound 클래스 라이브러리도 추가됨

기본 자바 가상 머신으로 핫스팟 VM 사용

썬의 연구 개발 주기 안정화 (약 2년마다 동물 이름을 딴 메이저 버전을 출시하고, 중간중간 곤충 이름을 딴 작은 업데이트 버전을 출시하기 시작)

- 2002.02.13: JDK 1.4 출시

정규 표현식, 예외 연쇄, NIO, 로그 클래스, XML 파서, XSLT 변환기 등 다수의 신기술 포함

- 2004.09.30: JDK 5 출시 (JDK 1.x 방식의 이름을 버리고 JDK x 형태로 부르기로 함)

자바 문법 변화 등장: 오토박싱, 제네릭스, 동적 애너테이션, 열거형, 가변 길이 매개 변수, foreach 순환문 등

자바 메모리 모델, java.util.concurrent 패키지 도입

- 2006.12.11: JDK 6 출시. 오픈 소스(openJDK) 전환

자바 기술 시스템 이름을 자바 EE6, 자바 SE6, 자바 ME6 형태로 변경

주요 개선 사항: 스크립트 언어 지원(모질라 자바스크립트 라이노 엔진 내장), 컴파일타임 애너테이션 처리기, 마이크로 HTTP 서버 API 제공 등

자바 가상 머신: 락(lock)과 동기화 구현, 가비지 컬랙션, 클래스 로딩 등 개선

코드 복잡도 증가, 자바의 오픈 소스화, 자바 FX 개발, 세계 경제 위기, 오라클에 썬 매각 등의 이유로 2년 주기로 메이저 버전을 출시하지 못함

- 2009.02.19: JDK 7 마일스톤 버전 완성

계획되어 있던 세부 프로젝트는 다음과 같았음

  • 람다(Lambda) 프로젝트: 람다식과 함수형 프로그래밍 지원
  • 직소(Jigsaw) 프로젝트: 가상 머신 수준에서의 모듈화 지원
  • 동적 언어 지원: 자바 언어는 정적 언어이지만 자바 가상 머신은 제 삼의 동적 언어 지원
  • G1 컬렉터: 고성능 가비지 컬렉터
  • 코인(Coin) 프로젝트: 자바 구문의 세부 사항 개선

하지만 한창 개발하던 썬은 기술 경쟁과 비즈니스 경쟁 양측에서 어려움이 있어 계획대로 진행할 수 없었기 때문에 그중 일부인 G1 컬렉터(실험 버전), 자바 외 언어 호출 지원 강화, 병렬 클래스 로딩 아키텍처 등만 포함

JDK 개발 주체가 오라클로 바뀌면서 오라클은 자바 SE 지원 요금제를 신설하여 상용 서비스로 바꿈

자바 SE의 핵심 기능을 맥 OS 에서도 공식 지원하기 시작 (지금까지 공식 JDK는 윈도우, 리눅스, 맥 OS 에서 동작하며 ARM, x86, x86-64 아키텍처를 지원)

이후, 오라클이 썬을 인수하여 자바 상표가 오라클로 넘어오게 됨

- 2014.03.18: JDK 8 출시

포함된 기능: 람다식 지원, 나스혼 자바스크립트 엔진 내장, 새로운 시간 및 날짜 API, 핫스팟에서 영구 세대 완전 제거

- 2017.09.21: JDK 9 출시

직소(모듈화 기능), JShell, JLink, JHSDB 등 많은 도구를 개선하고 핫스팟을 구성하는 모듈들의 로깅 시스템 수정, HTTP 2 단일 TCP 연결 API 등 총 9개의 JEP를 포함해 출시

한 번에 많은 기능을 추가하는 과정에서 발생하는 위험 요소를 줄이기 위해 JDK 메이저 버전을 해마다 3월 9월 두 차례 출시하기로 함.

이로 인해 빠르게 늘어나는 JDK 버전 브랜치에 대해 유지보수, 업데이트 관리, 기술 지원이 어려워져 모든 JDK 버전은 최소 3년 이상 지원한다 는 전통을 종식시키고, LTS 버전만 3년간 지원과 업데이트를 받을 수 있도록 함.

- 2018.03.20: JDK 10 출시

주 목표는 내부 리팩터링. 소스 저장소 통합, 가비지 컬렉터 인터페이스 통합, JIT 인터페이스 통합(JVMCI는 JDK9부터 존재했고 10에서는 그랄 JIT 컴파일러 추가) 등의 작업이 이루어짐

오라클은 JDBC, JMS, 서블릿과 그 외 널리 쓰이는 기본 요소(자바 SE, 자바 ME) 들은 여전히 소유하면서 자바 EE 소유권은 이클립스 재단에 넘김. 그 뒤로 Java 상표를 쓸 수 없어서 자카르타 EE로 이름이 바뀜

- 2018.09.25: JDK 11 출시 (JDK 8을 잇는 LTS 버전)

ZGC 가비지 컬렉터의 실험 버전 추가, 타입 추론의 람다 구문 지원 등

오라클은 남아 있던 상용 기능을 모두 오픈 소스로 공개하여 OpenJDK 11과 오라클 JDK 11의 코드 및 기능이 완전히 같아짐. 핵심적인 차이는 OpenJDK는 개발, 테스트, 프로덕션 모두를 무료로 사용할 수 있지만 오라클의 직접적인 업데이트 지원은 6개월로 제한되고, 오라클 JDK 역시 개인 용도로는 제약이 없지만, 프로덕션 환경에서 상업적으로 활용하려면 비용을 내야 함

직전 버전의 OpenJDK 유지 보수 관리 권한은 레드햇으로 이양됨

- 2019.03.19: JDK 12 출시

셰넌도어 가비지 컬렉터(레드햇이 개발을 주도) 포함. 하지만 목표하는 바가 오라클에서 개발한 ZGC와 거의 같아서 오라클 JDK 12에서 셰넌도어의 코드를 걷어내어 오직 OpenJDK에서만 이용할 수 있는 기능이 됨

- 2019.09.17: JDK 13 출시

소켓 API 재구현, 텍스트 블록 미리 보기 버전 추가

- 2020.03.17: JDK 14 출시

switch 문이 정식 표준이 됨. 맥OS와 윈도우에서도 ZGC를 지원하기 시작. CMS 가비지 컬렉터는 모든 플랫폼에서 제거

- 2020.09.16: JDK 15 출시

ZGC와 셰넌도어가 정식 기능이 됨. 텍스트 블록 정식 편입, 데이터그램 소켓 API 재구현

편향 락(biased lock)는 비활성화되고 폐기 대상으로 지정

- 2021.03.16: JDK 16 출시

메타스페이스 관리 방식 개선. instanceof 패턴 매칭, 레코드 클래스 도입 등의 개선

소스 코드 관리 시스템을 머큐리얼에서 깃(깃허브)로 옮김

- 2021.09.14: JDK 17 출시 (LTS)

봉인된 클래스 도입. 의사 난수 생성기 개선.

실험 버전으로 제공되던 AOT 컴파일러 삭제

- 2022.03.22: JDK 18 출시

UTF-8이 기본이 됨. 메서드 핸들을 이용하여 리플렉션을 다시 구현

종료자(finalize()) 폐기 대상 지정

- 2022.09.20: JDK 19 출시

외부 함수(foreign function) 및 메모리 API, 가상 스레드, 구조화된 동시성(structured concurrency) 등 많은 기능을 미리 보기 형태로 선보임

- 2023.03.21: JDK 20 출시

모두 미리 보기나 인큐베이터 상태라 정식 기능엔 변화 없음

- 2023.09.19: JDK 21 출시 (LTS)

세대 구분(generational) ZGC 와 가상 스레드 도입

세대 구분(generational) ZGC는 ZGC의 아이디어를 검증해 보고자 뒤로 미뤄 둔 세대별 가비지 컬렉션을 다시 추가한 버전

가상 스레드 도입은 커널 스레드에 의존하던 한계에서 벗어나 동시에 운용할 수 있는 스레드 수와 지연 시간이 대폭 개선됨.

x86용 32비트 윈도우 지원 폐기 대상으로 지정

728x90
반응형