자바의 대표적인 특징
- 하드웨어 플랫폼이라는 족쇄를 제거하여 한 번 작성하면 어디서든 실행된다 라는 이상을 실현
- 안전한 메모리 관리 시스템을 갖춘 덕에 메모리 누수 문제와 엉뚱한 메모리를 가리키는 문제 대부분을 피할 수 있음
- 런타임에 핫 코드(빈번하게 실행되어 전체 성능에 영향을 크게 주는 코드)를 감지, 컴파일하고 최적화하여 자바 애플리케이션이 최상의 성능을 내도록 도와줌
- 표준 API 자체가 풍부할 뿐 아니라 수많은 기업과 오픈 소스 커뮤니티에서 제공하는 다양한 기능의 서드 파티 라이브러리를 활용할 수 있음
자바 기술 시스템
자바 가상 머신 위에서 동작하는 코틀린, 클로저(Clojure), JRuby, 그루비 등의 프로그래밍 언어와 그 외 관련된 자바 프로그램들도 자바 기술 시스템에 속하는 것으로 봄
자바 기술 시스템의 요소
- 자바 프로그래밍 언어
- 다양한 하드웨어 플랫폼용 자바 가상 머신 구현
- 클래스 파일 포맷
- 자바 클래스 라이브러리 API(표준 API)
- 다른 기업과 오픈 소스 커뮤니티에서 제공하는 서드 파티 클래스 라이브러리
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비트 윈도우 지원 폐기 대상으로 지정
'📙 > Study' 카테고리의 다른 글
[JVM 파헤치기] 02. 자바 메모리 영역과 메모리 오버플로(1) (0) | 2025.03.23 |
---|---|
[JVM 파헤치기] 01.자바 기술 시스템 소개(2) (0) | 2025.03.18 |
[만들면서 배우는 클린 아키텍처] 12. 아키텍처 스타일 결정하기 (1) | 2024.10.20 |
[만들면서 배우는 클린 아키텍처] 11. 의식적으로 지름길 사용하기 (1) | 2024.10.19 |
[만들면서 배우는 클린 아키텍처] 10. 아키텍처 경계 강제하기 (1) | 2024.10.18 |