java
명령어는 자바 애플리케이션을 시작한다.
java
명령어는 먼저 JRE(Java Runtime Environment)를 시작하고,
인자로 지정된 클래스(public static void main(String[] args)
를 포함하고 있는 클래스)를 로딩하고,
main()
메서드를 호출한다.
$ java test.class 또는 $ java test를 통해 .class파일을 실행시키면
JDK를 사용해서 바이트코드(class 파일)를 만들고,
JRE를 사용해서 바이트코드를 실행하면,
JVM이 기동되면서 바이트코드의 실질적인 실행(실제 OS에 메모리 할당/회수, 시스템 명령 호출 등 요청)을 담당한다.
아래는 JDK, JRE, JVM 관계
JDK | JRE | JVM |
---|---|---|
JDK는 개발자 키트 개발에 필요한 어플리케이션 소프트웨어 | 소프트웨어 번들, 클래스와 라이브러리 및 필수적인 라이브러리 컴포넌트들을 제공 | 실행에 필요한 환경 제공 |
플랫폼에 독립적 | 플랫폼에 독립적 | 플랫폼에 종속적 |
java
명령어java
명령어의 인자로 지정된 클래스를 실행하기 위한 자바 환경이 조성됨을 의미main()
메서드가 존재하는지 확인한다java
명령어 인자로 지정한 설정 옵션에 맞게 JVM이 실행됨예를들어 NVIDIA 라는 그래픽카드 회사가 있다. 이 회사는 그래픽카드를 만드는 것 뿐만 아니라, 특정 스펙을 만들어서 주변 공급업체인 MSI, GIGABYTE 같은 회사에게 전달해주면, 이 회사 들은 전달받은 스펙에 따라 그래픽카드를 만들어서 판매되게 된다
Oracle 이라는 회사가, JVM의 스펙과 표준을 정의하면, 공급업체들이, JVM을 실제 그래픽카드처럼 실물을 만들어서 배포하게 된다. 이 공급업체를 Vendor라고 한다
자바는 느릴까?
자바의 특징인 인터프리터를 하는 과정과, 인터프리터 과정 전에, 컴파일 과정을 한번 걸쳐서 그러는데, 여전히 자바의 이런 특징 때문에, 여러 언어들로부터 공격(?)을 받는 이유
1. 컴파일 방식 : 소스코드를 한꺼번에 컴퓨터가 읽을 수 있는 native machine(기계어)로 변환
2. 인터프리터 방식 : 소스코드를 빌드시에 암것도 하지 않다가, 런타임시에 한줄 한줄 읽어가며 변환
-> Java는 두 방식 모두 사용 => JIT 컴파일러의 도입