이 기사는 JVM 메모리 영역 및 가비지 수집에 대한 분석(그림 및 텍스트)입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
1. JVM 소개
JVM, 전체 이름은 Java Virtual Machine, 즉 Java Virtual Machine입니다. 프로그래밍 언어로 Java로 작성된 애플리케이션은 JVM에서 실행됩니다. JVM은 컴퓨터의 다양한 기능을 실제 컴퓨터에 시뮬레이션하여 구현한 가상의 컴퓨터를 말합니다. Java의 매우 중요한 특징은 플랫폼으로부터의 독립성이며, JVM은 이러한 특징을 구현하는 핵심입니다.
JVM에 의한 프로그램 실행은 크게 두 단계로 나누어집니다. 첫 번째 단계는 컴파일입니다. 즉, .java 소스 파일을 .class 바이트코드 파일로 컴파일하는 것입니다. 해석 JVM 바이트코드 파일이 해석되고 실행됩니다. 2단계 흐름도는 아래와 같습니다. 🎜#
2. JVM 메모리 영역
전체 JVM 시스템은 두 개의 하위 시스템으로 구분됩니다. 첫 번째는 클래스 로더인 ClassLoader입니다. 이 클래스의 기능은 작성된 클래스를 JVM에 로드하는 것입니다. 두 번째는 컴파일된 바이트코드 파일을 해석하고 실행하는 실행 엔진인 실행 엔진입니다. 위에서 언급한 실행 엔진은 두 부분으로 나누어진다. 첫 번째 부분은 런타임 데이터 영역으로, JVM의 메모리에 해당한다. 두 번째 부분은 지역화된 인터페이스인 네이티브 인터페이스이다. , 주로 Java가 아닌 다른 프로그램을 실행하는 데 사용됩니다. 프로그래밍 언어로 작성된 프로그램입니다.핵심은 이전 런타임 데이터 영역으로 메소드 영역(메서드 영역), 힙(힙), VM 스택(가상 머신 스택), 프로그램 카운터 레지스터( 프로그램 카운터), 네이티브 메소드 스택. 처음 두 스레드는 공유되고, 나머지 세 스레드는 격리됩니다. 아래 그림과 같이
요약하면 JVM이 처음 실행될 때 Method 영역이 할당됩니다. ) 및 Heap(힙)을 가지며, JVM은 스레드를 만날 때마다 프로그램 카운터 레지스터(프로그램 카운터), VM 스택(가상 머신 스택), 네이티브 메서드 스택(네이티브 메서드 스택)을 할당합니다. 세 가지 가상 머신 스택, 로컬 메서드 스택 및 프로그램 카운터가 차지하는 메모리 공간도 해제됩니다. 데이터 영역이 스레드 공유와 스레드 격리로 구분되는 이유이기도 합니다. 3개의 스레드 격리 영역의 수명 주기는 자신이 속한 스레드의 수명과 동일하며, 스레드 공유 영역도 동일합니다. 순환이 스레드 공유 영역에서만 발생하는 이유이기도 합니다(실제로 대부분의 가상 머신의 경우 힙에서 발생함). 메모리 오버플로 예외는 다음과 같습니다.
1, 메소드 영역( 메소드 영역) 메서드 영역에는 상수 풀과 정적 필드가 포함됩니다. 로드된 클래스 정보(이름, 수정자 등), 클래스 정적 변수, 클래스 상수, 클래스 필드 정보, 클래스 메서드 정보를 저장합니다. 개발자가 Class 개체의 getName 및 isInterface와 같은 메서드를 통해 프로그램에서 정보를 얻을 때 이러한 데이터는 메서드 영역에서 가져옵니다.
2. 힙 힙은 JVM이 관리하는 가장 큰 메모리 조각입니다. Java에서는 거의 모든 객체 인스턴스와 배열이 여기에 있다고 볼 수 있습니다. new를 통해 생성된 모든 객체의 메모리는 여기에 할당되며, 힙에 있는 객체의 메모리는 GC가 재활용될 때까지 기다려야 합니다.
3. 프로그램 카운터 레지스터
프로그램 카운터는 현재 스레드가 실행하는 바이트코드의 줄 번호 표시입니다. , 카운터 값을 변경하여 실행할 다음 바이트코드 명령을 선택합니다. 분기, 점프 및 루프와 같은 기본 기능은 모두 이에 의존하여 구현됩니다.
4, VM 스택(가상 머신 스택)
가상 머신 스택은 Java 메소드 실행의 메모리 모델을 설명합니다. 각 메소드는 실행 시 스택 프레임을 생성합니다. 스택 프레임), 스택 프레임은 지역 변수 테이블(기본 데이터 유형, 객체 참조 등), 피연산자 스택, 동적 링크, 메서드 반환 주소 및 일부 추가 추가 정보를 저장하는 데 사용됩니다.
5. 네이티브 메소드 스택
이 영역은 가상 머신 스택이 Java 메소드를 실행하기 위해 가상 머신을 제공한다는 점을 제외하면 가상 머신 스택과 매우 유사한 역할을 합니다. 네이티브 메서드 스택은 사용되는 로컬 운영 체제(네이티브) 메서드를 제공합니다.
3. JVM 가비지 수집JVM의 GenerationalCollecting(가비지 수집) 원리는 객체를 Young Generation(Young), Old Generation(Tenured), Permency Generation(Perm)으로 나누고, 서로 다른 수명 주기를 가진 객체에 대해 서로 다른 알고리즘을 사용하는 것입니다.
보통 JVM 메모리 재활용은 항상 힙(힙) 메모리 재활용을 의미합니다. 사실 힙(힙)에 있는 내용만 동적으로 할당되므로 위 객체의 신세대와 올드 세대는 JVM의 힙(힙)을 참조합니다. . ) 공간이고, 영구 생성은 앞서 언급한 메소드 영역이며 힙에 속하지 않습니다.
1. Young Generation
Java 애플리케이션이 Java 객체를 할당하면 이러한 객체는 Young Generation 힙 공간에 할당됩니다.
이 공간은 대부분 작은 객체이며 자주 재활용됩니다
Young Generation으로 인해 heap 공간의 가비지 수집이 자주 발생하므로 가비지 수집 알고리즘은 재활용 효율성에 더 많은 주의를 기울일 것입니다
2. Old Generation
Young Generation Heap 공간에서 장기간 살아남은 개체가 전송됩니다(아마도 영구적으로) Old Generation 힙 공간으로
이 힙 공간은 일반적으로 Young Generation의 힙 공간보다 크고 공간 증가 속도도 느립니다
JVM 힙 공간의 대부분이 Old Generation에 할당되므로 가비지 수집 알고리즘은 더 많은 공간을 절약해야 합니다. 이 알고리즘은 낮은 가비지 밀도를 처리할 수 있는 힙 공간이 필요합니다
3. 영구 생성
은 VM 및 Java 클래스의 메타데이터는 물론 내부 문자열 및 정적 변수를 저장합니다.
이 세 가지 사항이 충족되면 생성 힙 공간이 부족하거나 새 요청을 할당할 공간이 충분하지 않은 경우 가비지 수집 메커니즘이 적용됩니다. 가비지 컬렉션에는 Minor GC와 Full GC의 두 가지 유형이 있습니다. Young Generation 힙 공간이 가득 차면 살아남은 객체를 Old Generation 힙 공간으로 이동하기 위한 컬렉션이 트리거됩니다. 이전 세대 힙 공간이 가득 차면 개체 힙의 전체 범위를 포괄하는 전체 컬렉션이 트리거됩니다.
JVM 메모리 영역 및 가비지 컬렉션에 대한 간략한 분석은 참고용입니다.
위 내용은 JVM 메모리 영역 및 가비지 컬렉션 분석(그림 및 텍스트)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!