- JRE : JVM + 라이브러리.
- JDK = JRE + 개발 관련 도구.
Java Virtual Machine으로, java를 실행하는 가상 머신이다.
C나 C++은 컴파일하는 환경(CPU + OS)과 실행하는 환경이 다를 경우, 프로그램이 정상적으로 동작하지 않을 수 있다.
운영체제마다 지원하는 시스템 콜 인터페이스가 다르기 때문이다.
이를 해결하기 위해, 크로스 컴파일을 진행한다. 예를 들면, 윈도우에서 MacOs에 맞게 컴파일해서 배포하는 것이다.
자바는 JVM을 통해 이 문제를 해결하였다.
각 운영체제에 맞게 설치된 JVM은 자바 바이트 코드(.class)를 실행함으로써, 자바 프로그램은 OS에 종속되지 않고, 어디에서나 실행된다. (Write Once, Read Anywhere)'
++ java Virtual Machine이지만, 코틀린으로 생성한 바이트 코드도 jvm에서 실행된다.
1. java compiler(javac)가 .java 파일을 컴파일하여 .class 파일(바이트 코드)로 변환한다.
2. .class 파일(Java Byte Code)은 클래스 로더에 의해 JVM 메모리에 적재된다.
3. 메모리에는 다섯 영역이 있는데, 클래스 파일에서 클래스 정보(변수, 메소드, 정적변수..)를 저장하는 메소드 영역과 동적으로 생성된 객체 인스턴스가 저장되는 힙 영역은 모든 스레드가 공유한다.
4. 네이티브 메소드 스택은 자바가 아닌 다른 언어에서 생성된 바이트 코드를 활용할 때 사용된다.
5. 실행 엔진에서는 바이트 코드를 기계어로 변환하여 명령어 단위로 프로그램을 실행한다.
이 때, 인터프리터 방식과 JIT 컴파일 방식을 혼합하여 사용하는데, 인터프리터 방식으로 실행하다가 적절한 시점에 JIT 컴파일러가 나머지 바이트 코드 전체를 컴파일하여 기계어로 변경하여 실행한다.
6. GC(Garbage Collector)는 힙 영역에서 더이상 사용하지 않는 영역을 탐지하고 관리한다.
**인터프리터 방식 : 명령어 단위로 읽어 실행하면서 오류가 있으면 멈춤. -> 느림
**참고
1. https://peonyf.tistory.com/entry/JVM
2. https://namu.wiki/w/%EC%9E%90%EB%B0%94%20%EA%B0%80%EC%83%81%20%EB%A8%B8%EC%8B%A0
3. https://catsbi.oopy.io/df0df290-9188-45c1-b056-b8fe032d88ca
4. https://coding-factory.tistory.com/827
5. https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80
6. https://velog.io/@bami/%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0-%EB%B0%A9%EC%8B%9D%EA%B3%BC-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-%EB%B0%A9%EC%8B%9D