JVM (Java Virtual Machine)은 무엇이며 내부적으로 어떻게 작동합니까?
JVM (Java Virtual Machine)은 컴퓨터가 Java 프로그램을 실행할 수 있도록 JAVA 런타임 환경 (JRE)의 중요한 구성 요소입니다. JVM은 플랫폼 독립적이므로 JVM 구현이있는 모든 장치 또는 운영 체제에서 Java Bytecode를 실행할 수 있습니다. JVM은 Java Bytecode와 기본 하드웨어 사이의 중개자 역할을하므로 다른 플랫폼에서 재 컴파일없이 Java 응용 프로그램을 실행할 수 있습니다.
내부적으로 JVM은 여러 주요 단계를 통해 작동합니다.
- 로드 : Java 프로그램이 실행되면 JVM은 먼저 바이트 코드가 포함 된
.class
파일을로드합니다. 클래스 로더 서브 시스템은 이러한 파일을 메모리에로드 할 책임이 있습니다.
- 검증 : 일단로드되면 바이트 코드는 Java의 보안 또는 무결성 제약 조건을 위반하지 않도록 확인됩니다. 이 단계는 악성 코드가 실행되는 것을 방지하는 데 도움이됩니다.
- 준비 : 이 단계에서 JVM은 클래스 변수에 대한 메모리를 할당하여 기본값으로 초기화합니다.
- 해결 : 여기에는 코드에서 직접 참조로의 상징적 참조를 해결하는 것이 포함됩니다. JVM 은이 단계에서 추가 클래스를로드해야 할 수도 있습니다.
- 초기화 : 정적 변수의 실제 초기화와 정적 초기화 블록의 실행은이 단계에서 발생합니다.
- 실행 : JVM은 실행 엔진을 사용하여 바이트 코드 지침을 실행합니다. 실행 엔진은 통역사와 JIT (Just-In-Time) 컴파일러로 구성 될 수 있습니다. 통역사는 바이트 코드 지침을 하나씩 읽고 실행하는 반면 JIT 컴파일러는 바이트 코드를 더 빠른 실행을 위해 기본 기계 코드로 변환합니다.
- 가비지 수집 : JVM은 메모리 할당 및 거래를 관리하여 더 이상 필요하지 않은 메모리가 쓰레기 수집을 통해 되 찾을 수 있도록합니다.
JVM의 주요 구성 요소와 그 기능은 무엇입니까?
JVM은 여러 가지 주요 구성 요소로 구성되며 각각은 특정 기능을 제공합니다.
- 클래스 로더 서브 시스템 : 이 구성 요소는 클래스 및 인터페이스로드, 연결 및 초기화를 담당합니다. 다양한 소스 (예 : 로컬 파일 시스템, 네트워크 위치)의 클래스로드하기 위해 계층 적 접근 방식을 사용합니다.
-
런타임 데이터 영역 (메모리 영역) : 프로그램 실행 중에 사용되는 여러 메모리 영역이 포함됩니다.
- 방법 영역 : 런타임 상수 풀, 필드 및 메소드 데이터와 같은 클래스 구조를 저장합니다.
- 힙 영역 : 객체를 저장하고 모든 스레드 사이에서 공유됩니다.
- 스택 영역 : 로컬 변수 및 부분 결과가 저장되는 프레임이 포함되어 있습니다. 각 스레드에는 자체 스택이 있습니다.
- PC 레지스터 : 스레드가 실행중인 현재 명령어의 주소를 보유합니다.
- 기본 메소드 스택 : 스택 영역과 유사하지만 기본 방법에 사용됩니다.
-
실행 엔진 : 이 구성 요소는 바이트 코드 지침을 실행합니다. 포함 :
- 통역사 : 한 번에 하나의 명령어를 Bytecode를 실행합니다.
- JIT (Just-In-Time) 컴파일러 : 더 빠른 실행을 위해 바이트 코드를 기본 기계 코드로 컴파일합니다.
- 쓰레기 수집기 : 더 이상 사용되지 않는 물체를 되 찾아서 메모리를 관리합니다.
- JNI (Java Native Interface) : Java 코드는 C, C 및 어셈블리와 같은 다른 언어로 작성된 기본 응용 프로그램 및 라이브러리에서 호출 및 호출 할 수 있습니다.
- 기본 메소드 라이브러리 : JVM이 기본 방법의 실행을 지원하기 위해 필요한 기본 라이브러리 모음.
JVM은 메모리를 어떻게 관리하고 쓰레기 수집을 수행합니까?
JVM의 메모리 관리에는 런타임 데이터 영역, 특히 힙 및 스택 내에서 메모리 할당 및 거래 할당이 포함됩니다. JVM이 메모리를 관리하는 방법은 다음과 같습니다.
-
메모리 할당 :
- 스택 메모리 : 로컬 변수 및 메소드 호출 세부 사항을 저장하는 데 사용됩니다. 메소드가 호출되고 반환 될 때 메모리가 자동으로 할당되고 거래됩니다.
- 힙 메모리 : 객체 저장에 사용됩니다. 새로운 객체가 생성 될 때 메모리가 할당되고 더 이상 참조되지 않을 때까지 사용 중입니다.
-
쓰레기 수집 :
JVM은 Java 응용 프로그램 성능을 향상시키기 위해 어떤 최적화를 적용합니까?
JVM은 Java 응용 프로그램의 성능을 향상시키기 위해 여러 최적화를 적용합니다.
-
방금 (JIT) 컴파일 :
- JVM은 JIT 컴파일을 사용하여 바이트 코드를 런타임 동안 기본 기계 코드로 변환합니다. 이로 인해 컴파일 된 코드가 해석 된 바이트 코드보다 훨씬 빠르게 실행됨에 따라 성능이 크게 향상됩니다.
-
인라인 :
- JIT 컴파일러는 작은 메소드를 호출 방법으로 인라인하여 메소드 호출의 오버 헤드를 줄일 수 있습니다. 이 최적화는 특히 자주 호출되는 방법에서 성능을 크게 향상시킬 수 있습니다.
-
루프 Unrolling :
- JIT 컴파일러는 루프 제어의 오버 헤드를 줄이고 다른 최적화를 가능하게하기 위해 루프를 풀어 줄 수 있습니다. 이는 단일 루프 반복 내에서 더 많은 루프 반복을 실행하여 성능을 향상시킬 수 있습니다.
-
데드 코드 제거 :
- JIT 컴파일러는 실행되지 않은 코드를 감지하고 제거하여 컴파일 된 코드의 크기를 줄이고 런타임 성능을 향상시킬 수 있습니다.
-
탈출 분석 :
- 이 기술은 객체를 힙 대신 스택에 할당 할 수 있는지 여부를 분석하여 가비지 수집의 필요성을 줄이고 성능 향상을 줄입니다.
-
적응 형 최적화 :
- JVM은 응용 프로그램의 성능을 지속적으로 모니터링하고 최적화 전략을 동적으로 조정합니다. 예를 들어, 자주 실행되는 메소드를 기본 코드로 컴파일하면서 해석 할 중요한 코드를 남기지 않을 수 있습니다.
-
프로필 유도 최적화 :
- JVM은 런타임 프로파일 링 데이터를 사용하여 최적화 결정을 안내합니다. 여기에는 추적 메소드 호출 주파수 및 분기 예측이 포함되어있어 애플리케이션의 가장 중요한 부분에 최적화 노력을 집중합니다.
이러한 최적화를 통해 JVM은 실행중인 코드의 특정 런타임 특성 및 워크로드 패턴에 동적으로 적응하여 Java 응용 프로그램의 성능을 크게 향상시킬 수 있습니다.
위 내용은 JVM (Java Virtual Machine)은 무엇이며 내부적으로 어떻게 작동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!