JVM이란 무엇입니까?
JVM은 Java 가상 머신입니다. 자바 가상 머신의 약자에서 파생된 약어입니다.
JVM(Java Virtual Machine)을 사용하면 Java 프로그램을 설치나 조치 없이 다른 운영 체제에서 실행할 수 있습니다.
따라서 리눅스나 윈도우 등 서로 다른 운영체제 환경에서도 함께 사용할 수 있다.
JVM은 시스템 메모리를 관리하면서 Java 기반 응용 프로그램을 위한 이식 가능한 실행 환경을 제공하는 것을 말합니다.
JVM은 어떤 환경에서도 Java 프로그램을 실행할 수 있도록 하고 프로그램 메모리를 관리하고 최적화합니다(자동 메모리 관리).
컴파일 방법
컴파일은 특정 프로그래밍 언어로 작성된 문서를 다른 프로그램이나 하드웨어에서 처리하기 쉬운 코드로 변환하는 프로세스입니다.
컴파일 명령
$ javac <파일이름.java>
javac는 JDK에 포함된 Java 컴파일러입니다.
소스 파일(.java)을 인수로 실행하면 오브젝트 파일(.class)이 생성됩니다. (Java 바이트코드는 아직 컴퓨터에서 읽을 수 없음)

Java 바이트 코드(.class)는 클래스 로더에 의해 JVM에 로드되고 실행 엔진에 의해 기계어로 해석되어 메모리(런타임 데이터 영역)에 저장됩니다.
달리는 방법
1. 개발자가 작성한 소스 코드(.java)는 Java 컴파일러에 의해 바이트 코드(.class)로 컴파일됩니다.
2. 변환된 바이트코드(.class)를 JVM의 클래스 로더에 전달합니다.
3. 클래스 로더는 필요한 클래스를 Runtime DataArea, 즉 JVM의 메모리로 동적으로 로드합니다.
4. 실행 엔진은 JVM 메모리에 업로드된 바이트코드를 하나씩 가져와서 실행한다. 이때 실행 엔진은 인터프리터 방식과 JIT 컴파일러 방식을 이용하여 바이트코드를 기계어로 변환한다.
바이트코드가 무엇인가
Java 바이트코드는 Java Virtual Machine이 이해할 수 있는 언어로 변환된 Java 소스 코드를 의미합니다.
Java 컴파일러에서 변환된 코드의 명령어 크기가 1바이트이므로 Java 바이트코드라고 합니다.
Java 바이트코드의 확장자는 .class이며 Java 바이트코드는 JVM(Java Virtual Machine)이 설치된 모든 운영 체제에서 실행됩니다.
package com.cos.shareHere.web.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class CMRespDto<T> {
private int code; // 1(성공), -1(실패)
private String message;
private T data;
}
Java 컴파일러에 의해 위의 Java 코드를 다음 바이트 코드로 변환하십시오.

JIT 컴파일러는 무엇이며 어떻게 작동합니까?
자바 바이트코드는 기계가 직접 실행할 수 있는 언어가 아닌 사람이 보기에 비교적 쉬운 형태로 작성된다. 실행 엔진은 이 바이트코드를 JVM 내의 엔진에서 실행할 수 있는 형식으로 변환합니다.
JIT 컴파일러란 무엇입니까?

IR(Intermediate Representation)은 소스 코드를 나타내기 위해 컴파일러 또는 가상 머신에서 내부적으로 사용하는 데이터 구조 또는 코드입니다. 중간 표현은 최적화 및 변환과 같은 추가 처리를 위해 설계되었습니다.
메모리 데이터 구조, 프로그램이 읽을 수 있는 특수 튜플 또는 스택 기반 코드
JVM 구성요소

클래스 로더는 컴파일된 Java 바이트코드를 메모리 공간에 로드하고 실행 엔진은 Java 바이트코드를 실행합니다.
클래스 로더 시스템
Java는 런타임에 클래스가 처음 참조될 때 클래스를 로드하고 연결하는 속성이 있습니다.
이러한 동적 로딩을 담당하는 부분은 JVM의 클래스 로더입니다.
- 로드 중
- 클래스 로더는 .class 파일을 읽고 해당 내용을 기반으로 적절한 이진 데이터를 생성하고 메서드 범위에 저장합니다.
- 로딩이 완료되면 적절한 클래스 유형의 클래스 객체가 생성되어 힙에 저장됩니다.
- 지름길
- 코드 내에서 레퍼런스를 연결하는 과정으로 3단계로 나뉩니다.
- 확인: .class 파일 형식이 유효한지 확인합니다.
- 준비: 클래스에 필요한 메모리를 할당하고 클래스의 필드, 메서드 및 인터페이스를 나타내는 데이터 구조를 준비합니다.
- 해결(해결, 선택 사항): 클래스의 상수 풀에 있는 모든 기호 참조를 실제 메모리 참조로 바꿉니다. (선택 사항인 이유는 교체할 수 있고 나중에 사용할 때 동적으로 교체할 수 있기 때문입니다.
- 기본값으로 재설정
- 정적 변수를 초기화하고 값을 할당하는 프로세스
저장
Java 애플리케이션을 실행할 때 사용되는 데이터를 로드하는 JVM의 메모리 영역.
실행 엔진
클래스 로더에 의해 메모리에 적재된 클래스(바이트코드)를 기계어로 변환하여 명령어 단위로 실행시키는 역할을 한다.
인터프리터와 JIT(Just-In-Time) 컴파일러로 모두 실행됩니다.
더 이상 참조되지 않는 객체는 GC(Garbage Collector)에 의해 수집 및 정리됩니다.
JNI(자바 네이티브 인터페이스) 네이티브 메서드용 인터페이스 및 라이브러리
Java 언어 자체로 해결할 수 없는 문제를 해결하는 방법 중 하나
Java 응용 프로그램에서 어셈블러로 작성된 함수를 사용하는 방법을 제공합니다.
JDK와 JRE의 차이점
JRE란 무엇입니까?

JRE는 Java 실행 환경입니다.
JRE는 JVM뿐만 아니라 Java 바이너리 및 Java 클래스 라이브러리를 포함하여 Java 프로그램의 실행을 지원합니다. 그러나 JRE에는 컴파일러 또는 디버거와 같은 도구가 포함되어 있지 않습니다.
Java 프로그램을 실행하기만 하고 개발하지 않으려면 JRE를 설치하십시오!
JDK란 무엇입니까?

JDK(Java Development Kit)는 Java 개발 키트입니다.
JDK는 Java 애플리케이션 개발을 위한 환경을 지원합니다.
JDK에는 JRE뿐만 아니라 컴파일러(javac), javadoc 및 jar와 같은 유용한 개발 도구도 포함되어 있습니다.
결론은 JRE는 Java 실행 환경이고 JDK는 Java 개발 도구라는 것입니다.

