1. 개요
Java Virtual Machine은 Java 프로그램을 실행하는 과정에서 관리 된 메모리를 여러 다른 데이터 영역으로 나눕니다. Java Virtual Machine에서 관리하는 메모리에는 다음 그림과 같이 다음 런타임 데이터 영역이 포함됩니다.
다음은 모든 영역에서 설명됩니다.
둘째, 데이터 영역 <br /> 프로그램 카운터 <br /> 프로그램 카운터는 현재 스레드에서 실행 된 바이트 코드의 줄 번호 표시기로 간주 될 수 있습니다. 가상 머신의 개념 모델에서 작업 코드 통역사 작업은 분기, 순환, 점프, 비정상적인 처리, 비정규 프로세싱과 같은 기본 기능을 변경하여 실행 해야하는 바이트 코드 지침을 선택하는 것입니다. 스레드 복구 및 기타 기본 기능은 모두 완료하려면이 카운터에 의존해야합니다.
멀티 스레드에서 스레드가 올바른 실행 위치로 돌아갈 수 있도록 각 스레드는 독립적 인 프로그램이 필요하지 않으므로이 메모리는 개인입니다.
스레드가 Java 메소드 인 경우이 카운터는 기본 메소드가 실행될 때 가상 머신 바이트 코드 명령의 주소를 기록합니다.
이 메모리 영역은 OutofMemoryError를 지정하지 않는 유일한 영역입니다.
Java 가상 기계 스택
Java Virtual Machine 스택도 비공개이며 수명주기는 스레드와 동일합니다. 가상 머신 스택은 Java 메소드에 의해 실행 된 메모리 모델을 설명합니다. 각 방법은 로컬 가변 테이블을 저장하고 스택 작동, 동적 링크 된 목록, 메소드 내보내기 정보 등을 저장하는 스택 프레임을 만듭니다. 호출 프로세스에서 완료 프로세스가 호출 될 때까지 가상 머신 스택에 스택을 스택으로 입력하는 프로세스에 해당합니다.
로컬 변수 테이블에서 다양한 기본 데이터 유형 (부울, 바이트, char, 단편, 플로트, 길, 이중), 객체 참조 및 ReturnAddress 유형이 컴파일러에 저장됩니다.
확장 중에 충분한 메모리를 신청할 수 없으면 OutofMemoryError 예외가 발생합니다.
로컬 메소드 스택 <br /> 로컬 메소드 스택은 가상 머신과 유사합니다. 가상 머신 스택은 가상 머신에서 수행되는 Java 메소드와 로컬 메소드 스택이 가상 시스템에서 사용하는 기본 메소드를 제공한다는 것입니다. . 일부 가상 머신은 로컬 메소드 스택과 가상 머신 스택을 직접 결합합니다.
Stackoverflowerror와 OutofMemoryError 이상을 던질 것입니다.
자바 파일
Java 파일은 모든 스레드가 공유하는 메모리 영역입니다.
Java 파일은 쓰레기 수집기 관리의 주요 영역입니다. 컬렉터는 기본적으로 재활용 알고리즘의 분할에 사용되기 때문에 Java 파일은 새로운 세대와 노년기와 같이 세분화 될 수 있습니다. 메모리 분포의 관점에서, 스레드 공유 Java 파일은 여러 스레드를 개인적으로 분산 된 버퍼 (TLAB)로 나눌 수 있습니다.
Java 파일은 논리적으로 연속적인 한 물리적 불연속 메모리 공간에있을 수 있습니다. 구현 측면에서 고정 크기 나 확장을 달성 할 수 없습니다.
힙에 메모리 완료 인스턴스 할당이없고 파일을 완료 할 수없는 경우 OutofMemoryError가 버려집니다.
방법 영역
방법 영역은 다양한 스레드가 공유하는 메모리 영역입니다. 정보, 상수, 정적 변수 및 가상 컴퓨터에서 컴파일 된 인스턴트 컴파일러와 같은 데이터를 저장하는 데 사용됩니다.
상대적으로 말하면,이 영역에는 거의 쓰레기 수집 행동이 거의 나타나지 않았지만 데이터가 입력되는 방법 영역에는 영구적으로 존재하지 않습니다.
방법 영역이 메모리 분포의 요구를 충족시킬 수 없으면 OutofMemoryError가 버려집니다.
상수 수영장 실행 :
이 방법은 방법 영역의 일부이며 컴파일 기간에 의해 생성 된 다양한 유형 및 기호 참조를 저장하는 데 사용됩니다.
직접 기억
직접 메모리는 가상 머신이 실행될 때 데이터 영역의 일부가 아니며, 채널 및 버퍼를 기반으로하는 IO 메소드 가이 메모리에 대한 참조로 작동 할 수 있습니다.
직접 메모리 할당은 Java 파일의 크기에 의해 제한되지 않지만 메모리의 크기에 따라 제한되며 모든 사람들은 OutofMemoryRerror 예외를 던질 수 있습니다.
셋째, 물체의 생성, 레이아웃 및 액세스 프로세스
객체 생성
객체를 만들려면 일반적으로 새로운 키워드가 필요합니다. 가상 기회가 새로운 명령어가 필요합니다. 먼저이 명령어의 매개 변수가 일정한 풀, 분석 및 초기화에 위치하고 있는지 확인하십시오. 해당 클래스 로딩 프로세스가 실행되는 경우.
수업이로드되면 가상 머신은 신입생에게 메모리를 할당합니다. 물체에 공간을 할당하는 작업은 Java 파일의 크기로 결정된 메모리 조각을 나누는 것과 같습니다. 할당하는 두 가지 방법이 있습니다. 하나는 포인터 충돌이라고합니다. 다른 이름은 빈 목록입니다. Java 파일의 메모리가 규칙적이지 않은 경우 가상 머신은 하나의 목록을 유지해야합니다. 객체 인스턴스. 그리고 목록의 업데이트. 어떤 분포 방법은 Java Heap이 조절되는지 여부와 Java 힙이 압축 및 조직 기능으로 사용되는지 여부에 의해 결정되는지에 의해 결정됩니다. 고려해야 할 또 다른 문제는 객체가 생성 할 때 스레드 보안 문제입니다. 하나는 메모리 공간을 할당하는 작업을 동기화하는 것입니다. Java 파일의 메모리 (tlab)는 TLAB에 할당 된 TLAB에 할당 된 스레드가 새로운 TLAB를 할당 할 때만.
메모리 분포가 완료되면 가상 머신은 분산 메모리 공간을 0으로 초기화해야합니다. 이 단계는 객체의 인스턴스 필드가 초기 값없이 Java 코드에서 직접 사용할 수 있도록합니다.
다음으로, 가상 머신은 클래스의 인스턴스인지, 클래스의 메타 데이터 정보를 찾는 방법 등과 같은 필요한 설정을 설정해야합니다.이 정보는 객체의 객체 헤드에 저장됩니다.
위의 작업이 완료되면 가상 머신의 관점에서 새로운 객체가 생성되었습니다. 그러나 Java 프로그램의 관점에서, INT 방법은 프로그래머의 소원에 따라 객체를 초기화해야합니다.
객체의 메모리 레이아웃
핫스팟 가상 머신에서 메모리에있는 물체의 레이아웃은 객체 헤드, 인스턴스 데이터 및 정렬 충전의 세 부분으로 나눌 수 있습니다.
객체 헤드에는 두 부분이 포함되어 있습니다. 첫 번째 부분은 해시 코드, GC 노화 연령 및 스레드가 보유한 잠금 장치와 같은 객체 자체의 데이터를 저장하는 데 사용됩니다. 공무원은 "마크 워드"라고합니다. 두 번째 부분은 유형 포인터, 즉 클래스 메타드 데이터에 대한 객체의 포인터이며 가상 머신은이 포인터에 의해이 객체의 어떤 클래스인지를 결정합니다.
인스턴스 데이터는 객체에 저장된 효과적인 정보이며 프로그램 코드에 정의 된 다양한 필드 컨텐츠이기도합니다.
정렬 충전물이 반드시 존재하지는 않지만 점령 캐릭터의 역할을 수행합니다. , Hotpot VM은 객체의 시작 주소는 8 바이트의 머리카락이 8 바이트의 배수이어야합니다. 조정.
객체 액세스 포지셔닝
Java 프로그램은 스택의 참조 데이터를 통해 스택의 특정 객체를 작동합니다. 주요 액세스 방법은 두 가지 유형입니다 : 핸들과 직접 포인터 :
직원 : Java Heaps는 핸들 풀이 참조에 저장되므로 메모리를 그립니다. 그림과 같이 :
직접 포인터 : Java 파일 객체의 레이아웃은 액세스 유형의 유형 데이터의 관련 정보를 배치하는 방법을 고려해야하며 객체 주소는 참조에 저장됩니다. 그림과 같이 :
두 가지 방법은 핸들을 사용하는 가장 큰 장점이 있습니다 포인터 포지셔닝에 대한 시간 소비.
위는이 기사의 모든 내용입니다.