자바는 JVM를 사용하기 때문에 어떠한 OS에서도 실행할 수 있다.
JVM은 Java Virtual Machine의 약자로, 자바 가상머신이라는 뜻이다.
자바 가상머신은 자바로 작성된 프로그램이 어떤 OS에서든 JVM만 설치되어 있다면 실행할 수 있게 도와준다.
JDK?
JDK는 Java Development Kit의 약자로 자바 개발자 키트이다.
여기에는 자바 개발에 필요한 기능들이 들어있다.JRE?
JDK에는 JRE가 포함되어있는데 Java Runtime Environment의 약자이다.
이는 자바 실행환경으로 자바 프로그램을 실행하는 기능을 하지만, 개발에 필요한 기능이 부족해 JRE만으로 개발할 수 없다.
JVM이 여기에 포함되어있다.

가장 먼저 개발자가 코드를 작성한다.
이는 .java라는 확장자를 가진다.
컴파일러가 자바 소스코드(.java)를 바이트코드(.class)파일로 컴파일 한다.
여기까지가 컴파일 타임 환경에서 일어나는 일이다.바이트코드
JVM이 이해할 수 있는 코드로, 바이트코드를 JVM이 읽어 어느 OS에서든 실행 가능하다.
몇 개의 예외가 있지만, 자바 컴파일러에 의해 변환되는 각 코드의 명령어 크기가 대부분 1바이트라서 바이트 코드라고 부른다.
여기서 부터는 런타임 환경 즉, JRE 에서 일어나는 일이다.
바이트 코드를 클래스 로더에게 전달한다.
클래스 로더 세부 동작
로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드한다
검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사한다
준비 : 클래스가 필요로 하는 메모리를 할당한다. (필드, 메서드, 인터페이스 등등)
분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.
초기화 : 클래스 변수들을 적절한 값으로 초기화한다. (static 필드)런타임 데이터 영역
JVM이 OS위에서 실행되면서 할당 받는 메모리 영역이다.
런타임 데이터 영역에 있는 바이트 코드들을 명령어 단위로 읽어서 실행한다.
실행 엔진은 크게 2가지 방식이 존재한다.
Interpreter
바이트 코드를 해석하여 실행하는 역할을 수행한다.
호출할때마다 실행하기 때문에 같은 메소드라도 여러번 호출하면 매번 실행한다.JIT(Just In Time) Compiler
반복되는 코드를 발견해 전체 바이트 코드를 컴파일힌다.
Garbage Collector
더이상 참조하지 않는 객체를 모아 제거한다.
일반적으로는 자동으로 수행된다.
바이너리 코드: 컴퓨터가 인식할 수 있는 0과 1로 이루어진 코드
기계어: CPU회사별로 바이너리 코드로 작성된 기계어를 다르게 사용한다.
기계어는 바이너리 코드이지만 바이너리코드가 기계어는 아니다.
바이트 코드: CPU는 이해하지 못 하지만 가상머신이 이해할 수 있는 언어이다.
바이트 코드를 JVM이 각 os의 CPU들이 이해할 수 있는 기계어로 변환한다.
출처
https://yang-droid.tistory.com/48
https://hungseong.tistory.com/57
https://catsbi.oopy.io/df0df290-9188-45c1-b056-b8fe032d88ca#fab35a02-d357-48e9-9a37-291b7c3cf1e7
https://velog.io/@woo00oo/자바-컴파일-과정
https://velog.io/@ddangle/Java-클래스-로더란
https://gyoogle.dev/blog/computer-language/Java/컴파일%20과정.html
https://wjddntjr555w.tistory.com/41
https://velog.io/@ddangle/Java-JVMJava-Virtual-Machine#references