Java로 개발한 프로그램을 컴파일하여 바이트코드를 실행시키기 위한 가상 머신. JRE(Java Runtime Environment)에 포함되어 있으며, Java 컴파일러가 프로트엔드를 담당한다면 Java 가상 머신은 코드 최적화와 백엔드를 담당한다.
Java 소스코드는 javac 컴파일러를 거쳐 바이트코드로 변환되며, 이 바이트코드는 JRE에 들어있는 java classloader에 의해 JVM으로 적재되고 JVM은 적재된 바이트 코드를 JIT 컴파일 방식으로 실행한다.

JVM은 플랫폼 독립적으로, JVM이 실행 가능한 환경이라면 어디서든 Java 프로그램이 실행된 수 있도록 한다.

1. JVM 종류

종류 개발사
HotSpot Sun Microsystems
JRockit BEA System
Eclipse OpenJ9 IMB J9 기반
Kafee 클린 룸
IMB J9 IBM

 - 윈도우, 리눅스 등의 환경에서는 대부분 Hotspot이 사용되지만, IBM AIX에서는 IBM J9이 사용된다.


2. JVM 구조

<JVM 구조>


3. JVM 성능
 바이트코드는 실제 기계에서 직접 실행되는 것이 아니라 JVM의 해석 단계를 거쳐 실행되므로 Java로 개발된 프로그램은 같은 기능의 네이티브 언어보다 실행 속도가 느리다. 과거에는 바이트코드를 순수하게 인터프리트 하여 매우 느렸으나 현재는 JIT 컴파일의 도입과 하드웨어의 발전으로 성능이 개선되었다.

 JVM은 추상적인 머신이며, 메모리의 접근을 가상 머신 차원에서 관리하고 있으므로 런타임에 최적화가 가능하다. 특수한 상황에서는 네이티브 언어보다 우월한 성능을 보여주기도 하지만, JIT 컴파일 시간, 가비지 컬렉션을 위한 시간 등이 필요하므로 근본적인 한계가 있다.


4. 가비지 컬렉션(GC)
 JVM은 가비지 컬렉션을 수행하여 할당되었다가 더 이상 쓰이지 않는 메모리를 자동으로 회수한다. Full GC(전체 가비지 컬렉션)의 경우 프로그램 수행을 일시정지(Stop-the-world) 시켜놓고 할 수밖에 없는데, 이게 규치적이지 않고 이유 없이 뚝뚝 끊긴다는 악명을 떨치는데 공헌했다. 대규모 서비스의 운영시 Full GC는 성능에 상당히 심각한 영향을 주므로 프로그래머의 GC튜닝이 필수로 들어간다. 최신 버전(11~12 이후)의 JVM에는 힙의 크기와 상관없이 일시정지 시간이 10ms이하인 GC 알고리즘들(ZGC, Shenandoah)이 탑재되어 있다.

JVM 모니터링 클라이언트 VisualVM과 그 프러그인 Visual GC를 설치하면 가비지 컬렉팅 상황을 시각적으로 확인할 수 있다.

 

참조: 나무위키(https://namu.wiki/w/%EC%9E%90%EB%B0%94%20%EA%B0%80%EC%83%81%20%EB%A8%B8%EC%8B%A0?from=JVM)

Sun Microsystem에서 1995년에 개발한 객체지향 프로그래밍 언어. 창시자는 제임스 고슬링이다.
2010년에 Oracle이 Sun을 인수하면서 Java 저작권을 소유함.
현재는 OpenJDK는 GPL2이나 Oracle이 배포하는 Oracle JDK는 상업 라이선스로 2019년 1월에 유료화됨
Java EE는 Eclipse 재단의 소유이다. Java언어는 J2SE 1.4부터는 JCP(Java Community Process)에서 개발을 주도함.

 

1. JAVA  분류

분류 특징
Java SE
(Java Standard Edition / J2SE)
대부분의 사람들이 가장 많이 접하는 표준 에디션.
Java의 핵심 API와 기능들을 제고한다.
Jakarta EE, 구 Java EE
(Java Enterprise Edition / J2EE)
기업에서 운영하는 서버 페이지에 특화된 에디션.
JSP와 서블릿을 비롯한 웹 어플리케이션 서버 관련된 기술들이 포함되어 있음.
Java ME
(JAva Micro Edition / J2ME)
PDA나 셋톱박스, 센서 등의 임베디드 시스템에 특화된 에디션.
JavaFX 데스크톱 어플리케이션 개발 및 배포를 위한 에디션.
크로스플랫폼 이식과 GUI 라이브러리를 제공한다.

 

2. JAVA 특징
 - 소스코드를 기계어로 직접 컴파일하여 링크하는 C/C++의 컴파일러와 달리 자바 컴파일러는 바이트코드인 클래스 파일(. class)을 생성한다. 이 파일의 바이트코드를 읽은 뒤 기계어로 바꾸어 실행하는 것은 Java Virtual Machine(JVM)이다. 따라서 자바의 가장 큰 특징은 JVM이 설치된 곳이면 어디든지 실행되는 플랫폼 독 집적인 언어이다.

 

3. JAVA 장점
 1) 수많은 개발자와 레퍼런스
 2) 비교적 높은 생산성
 3) 기기 호환성
 3) 안정성
 4) 소스코드 가독성

 

4.  JAVA 단점
 1)  속도문제
   - JVM 로딩 속도 문제
   - 가상 머신 바이트코드 실행 속도 문제
   - 가비지 컬렉션에 의한 실행 지연 문제
 2) 불필요한 예외처리
 3) 소스코드 길이

 

참조: 나무위키(https://namu.wiki/w/Java)

Java 버전별 특징들을 정리한 내용입니다.

JAVA 버전 발표일 특징 비고
Java SE 13 2019년 9월 17일 - switch문에 yield 예약어 추가  
Java SE 12 2019년 3월 19일 - switch문 확장 ( -> )
- 가비지 컬렉터 개선
- 마이크로 벤치마크 툴 추가
- 성능개선
 
Java SE 11 2018년 9월 25일 - lambda 파라미터에 대한 지역변수 문법
- 엡실론 가비지 컬렉터
- HTTP 클라이언트 표준화
- OracleJDK의 독점기능이 OpenJDK에 이식 (OracleJDK와 OpenJDK가 동일해짐)
- 2019년 1월부터 OracleJDK가 유료 모델로 전환

-
eclipse 재단으로 넘어간 Java EE 삭제
- JavaFX도 JDK에서 분리하여 별도 모듈 제공

Java SE 10 2018년 3월 20일 - var 키워드를 이용한 지역변수 타입추론
- 병렬처리 가비지 컬렉터
- 개별 Thread로 분리된 Stop-The World
- 루트 CA
- JVM heap영역을 시스템 메모리가 아니 다른종류의 메모리에도 할당
- JDK 레토지토리가 하나로 통합
- Java기반 JIT 컴파일러
- 이전 버전 deprecated처리된 API 삭제
Java SE 9 2017년 9월 21일

- Jingsaw 기반 런타임 모듈화(module)
- JShell 추가(인터프리터 셀처럼 사용)
- private interface method
- immutable collection
- 통합 로깅
- HTTP/2
- HTML 5 JavaDoc
- 프로퍼티 파일에 UTF-8 지원

- 버전을 1.x로 하지 않고 9.0으로 변경
- Ahead-of-time compiler 시범 적용
- Java Applet 기능 종료
- 64비트 버전만 출시

Java SE 8 2014년 3월 18일 - lambda expression
- type annotation
- stream api 추가
- repeating annotation
- static link library
- interface default method
- unsigned integer 계산
- 날짜와 시간 API(new) -> JodaTime
- rhino 대신 nashorn javascript 엔진 탑재
- 32비트 지원 마지막 공식버전
Java SE 7 2011년 7월 7일 - diamond operator <>
- try-resource
- multi-catch
- switch문에 String 사용
- concurrency API(new)
- File NIO(new)
- Java2D 지원
- dynamic language 지원
 
Java SE 6 2006년 12월 11일 - interface에 @Override 추가됨
- JDBC 4.0
- Scripting Language Support
- Java Compiler API
- pluggable annotation
- J2SE -> Java SE로 변경
J2SE 5 2004년 9월 30일 - generics
- annotation
- auto boxing/unboxing
- enumeration
- 가변길이 파라미터
- static import
- concurrency API
- 버전중 1을 빼고 표기
(내부적으로는 1.5, 1.6, 1.7 등을 사용)
J2SE 1.4 2002년 2월 6일 - assert
- regular expression
- NIO
- IPv6
- XML API
- JCE
- JSSE
- JAAS
- Java Web Start
 
J2SE 1.3 2000년 3월 8일 - HotSpot JVM
- JNDI
- JPDA
- JavaSound
- RMI가 CORBA 지원
J2SE 1.2 1998년 12월 8일 - strictfp
- SWING GUI
- JIT CORBA
- Collections
- JDK -> J2SE로 변경 (J2SE 5까지 사용)
- 1999년 업데이트를 통한HotSpot JVM
JDK 1.1 1997년 2월 19일 - inner class
- JavaBeans
- RMI
- reflection
- unicode
- 국제화(internationallization)
 
JDK 1.0 1996년 1월 23일   - 이전에 Oak로 불렸으나, 안정화 작업을 거친 1.0.2부터 JAVA로 변경
JDK 1.0a2 1995년 5월 23일   - 자바 언어가 정식으로 발표된 날
JDK 1.0a 1994년    

 

참조: 나무위키(https://namu.wiki/w/Java)