💡 자바언어의 특징
- 운영체제에 독립적
- 자바가상머신(JVM)을 통하여 운영체제 · 하드웨어에 관계 없이 실행 가능
- JVM이 운영체제에 종속적이기 때문에 여러 운영체제에 지원 가능한 JVM이 존재
- 객체지향언어
- 자동 메모리 관리(Garbage Collection)
- 자바로 작성된 프로그램이 실행되면 가비지컬렉터(garbage collector)가 자동적으로 메모리 관리
- 네트워크와 분산처리를 지원
- 다양한 네트워크 프로그래밍 라이브러리(Java API)를 통해 비교적 짧은 시간에 네트워크 관련 프로그램을 개발할 수 있도록 지원
- 멀티쓰레드의 지원
- 일반적으로 멀티쓰레드(multi-thread)의 지원은 사용되는 운영체제에 따라 다르지만 자바에서 개발되는 멀티쓰레드 프로그램은 시스템과 관계없이 구현 가능
- 여러 쓰레드에 대한 스케줄링을 자바 인터프리터가 담당
- 동적 로딩(Dynamic Loading) 지원
- 일반적으로 여러 개의 클래스로 구현되어 있는 애플리케이션을 실행시에 모두 로딩되지 않고 필요 시점에 로딩하여 사용할 수 있음
💡JVM
Java Virtual Machine, 자바를 실행하기 위한 가상 컴퓨터

자바로 작성된 애플리케이션은 모두 JVM에서만 실행되기 때문에,자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.
- 자바 바이트코드를 실행
- 메모리 관리 (가비지 컬렉션)
- 플랫폼 독립성 보장
개발자는 한 번만 프로그램을 작성하면, 모든 운영체제에서 같이 사용할 수 있음
💡자바 프로그램 실행 과정

컴파일 타임 환경
java로 작성된 파일 -> 컴파일러가 컴파일 수행 -> .class 바이트코드 파일 생성
런타임 환경
- 클래스 로더가 필요한 클래스 로딩
- 자바 인터프리터와 JIT 컴파일러가 바이트코드를 해석하고 실행
> JIT 컴파일러 : 자주 실행되는 코드를 캐시에 저장 이후 다음에 같은 코드가 실행될 때 인터프리팅 대신 캐시된 기계어를 직접 실행
- 런타임 시스템이 전반적인 실행환경 관리
- 운영체제와 하드웨어에서 프로그램이 실행
- 컴파일 방식
- 소스코드 전체를 한번에 기계어로 변환
- 실행 전 전체 코드를 검사하므로 실행 준비시간 ↑
- 실행 후 모두 기계어로 변환되어 있어 속도 ↑
- 인터프리터 방식
- 소스코드를 한 줄씩 실시간으로 해석하여 실행
- 준비시간이 짧으나 속도가 비교적 짧음

Reference