Oracle 공식 문서에 따르면 Java는 언어인 동시에 플랫폼이다.
인터넷과 컴퓨터 기기의 발달에 따라 다양한 프로그램에 대응해야 할 일은 늘어나는데, 그럴 때마다 새로운 언어를 배우는 것 혹은 기존 프로그램을 새로운 OS에 이식하는 것은 개발자와 회사 입장에서 모두 부담스러운 일이다. 하지만 Java는 사용함으로써 이러한 걱정을 할 필요가 없다. Java 기반 프로그램은 컴퓨터 기계의 구조, OS, 유저 인터페이스와 상관없이 사용할 수 있기 때문이다.
이를 자바의 ‘이식성’ 혹은 '독립성'이라고 일컫는다. (Write once, run anywhere)
Java를 플랫폼에 상관없이 사용할 수 있는 이유는 JVM 덕분이다. JVM이란 자바 가상머신으로, 컴퓨터로 하여금 자바 기반의 프로그램을 실행시킬 수 있게 해주며 프로그램의 메모리도 관리해준다. 자바 이전까지 모든 컴퓨터 프로그램은 특정 OS를 위해 쓰였고 메모리는 개발자들이 관리해야 했다고 한다.
윈도우, 맥, 리눅스 운영체제에서는 주로 그 운영체제의 실행파일(.exe, .app, .sh)들만이 실행 가능하다. 하지만 오라클이 각 운영체제 별로 그에 맞는 JVM을 만들었기 때문에 해당 운영체제에 맞는 JVM을 깔아두면 JVM이 해당 운영체제에서도 돌아갈 수 있도록 만든다.
JVM은 인터프리터와 JIT 컴파일러를 통해 바이트 코드를 각 운영체제에 맞는 기계어로 해석시켜 실행시키고, 가비지 콜렉터를 통해 어플리케이션의 동적 메모리를 관리한다.
📍 인터프리터
📍 JIT(Just-In-Time) 컴파일러
자바 언어에서 개발자는 .java확장자를 가진 파일에 소스코드를 작성한다. 그러면 자바 컴파일러(javac)가 이를 바이트 코드 파일인 .class파일 컴파일한다. 그럼 JVM이 .class파일을 읽어서 동작 시킨다.
바이트 코드 파일(Byte code)은 완전한 기계어가 아니라서 바로 실행할 수 없고 JVM이 꼭 필요하다.
하지만 가상머신을 사용함으로써 CPU가 직접 실행하는 네이티브 코드보다 약 2.5배 느리다는 단점이 있다. 그래서 복잡한 프로그램이나 게임에는 적합하지 않다. 또 각 플랫폼의 고유한 기능을 사용하기도 어렵다.
자바 런타임 환경은 컴퓨터 운영체제 위에서 실행되면서 자바를 위한 부가적인 서비스를 제공하는 소프트웨어 계층이다.
완성된 프로그램을 실행하는데 필요한 환경으로 JVM 실행에 필요한 라이브러리 및 클래스들을 제공한다.
java.lang, java.util, java.sql 등등
자바 가상 머신 : 자바 프로그램을 실행하기 위해 물리적 머신(컴퓨터)과 유사한 머신을 소프트웨어로 구현한 것
자바 코드를 컴파일하여 만들어진 .class 바이트 코드 파일은 JVM이 이해할 수 있는 코드로 JVM은 바이트 코드를 기계어로 변환한다.
JVM을 사용하면 하나의 바이트 코드(.class)로 모든 플랫폼에서 동작하도록 할 수 있다.
Java는 플랫폼에 의존적이지 않지만, JVM은 플랫폼에 의존적이라서 리눅스의 JVM과 윈도우의 JVM은 다르다.
자바로 만든 모든 프로그램은 실행하기 위해서 JVM이 있어야 한다.
JVM은 두 번의 컴파일 과정때문에 성능 이슈가 있었는데 JIT 컴파일러를 통해 같은 코드를 매번 해석하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱하면서 성능을 향상 시켰다.
JDK안에 JRE가 있고, 그 안에 JVM이 있다.