메모리 및 메모리 오버 플로우 예외의 자바 지역, 객체를 생성하는

런타임 데이터 영역

그림 삽입 설명 여기

프로그램 카운터 (프로그램 카운터 레지스터)

작은 메모리 공간으로 볼 수있다현재 쓰레드 표시 라인 번호에 의해 실행되는 바이트 코드. 가상 기계의 개념적 모델에서는이 작업의 바이트 코드를 인터프리터는 다음의 바이트 코드를 선택하는 카운터의 값을 변경함으로써 명령, 분기 만들며, 분지, 예외 처리를 실행하는 것으로하고, 다른 기본 기능 스레드 회복되어 전체에 카운터에 의존 할 필요가있다.
"스레드 개인"각 스레드 의한 판정 언제든지 다시 전환 스레드에 의한 프로세서 실행 시간의 할당을 달성하는 멀티 - 스레드 Java 가상 머신에 별도의 프로그램 카운터를 가지고, 프로세서 만 것 . 명령 실행 스레드
자바 방법이 수행되는 경우, 카운터는 실행되는 가상 머신 바이트 코드 명령어의 주소를 기록하고, 고유 메소드 경우, 카운터 값은 널 (null)이며
, 프로그램 카운터가JVM OutOfMemoryError가 상황이 유일한 지역을 제공하지 않습니다.

스택 자바 가상 머신 (Java 가상 머신 스택)

스레드 개인생명주기와 동일한 스레드.
자바 메모리 모델 한 방법이 실행 가상 머신 스택은 : 오퍼랜드 스택, 동적 링킹, 방법 수출 저장된 로컬 변수 테이블의 정보를 수행하는 동안 각각의 방법은, 스택 프레임을 생성한다.
로컬 변수 테이블 : 컴파일러에 공지 된 다양한 종류의 기초 자료를 저장하는 오브젝트 참조의 유형 (참조 형은, 그 오브젝트 자체와 일치하지 않는, 시작 주소 오브젝트 포인터를 참조 할 수 있으며, 그 물체를 나타내는 지점이 될 수있다 핸들 등이 위치와 연관된 오브젝트) 및 리턴 주소 유형 (바이트 코드 명령의 어드레스를 가리키는).
스택 프레임에 대응하는 각 처리의 실행에있어서, 상기 스택으로부터 스택을 처리하는 가상 머신 스택이다.
방법을 입력 할 때 상기 프레임에 할당 된 로컬 변수 완전히 로컬 변수 테이블의 크기를 변경하지 않을 방법의 구현시에 결정되는 경우,이 방법은 많은 공간을 필요로한다.
이상 두 종류:
깊이보다 스레드 요청 스택 깊이보다 가상 머신에 의해 허용되는 경우 (1), StackOverflowError 예외가 발생된다.
가상 머신이 동적으로 스택을 확장 할 수있는 경우 2. 충분한 메모리가 OutOfMemoryError가 발생합니다의 확장 적용 할 수 있습니다.
예 : 재귀 참조 서로 두 엔티티 클래스.

네이티브 메소드 스택 (네이티브 메소드 스택)

가상 스택 기계 비슷한 효과 차이 : 네이티브 방법 서비스에 대한 가상 시스템의 자바 가상 머신 과정 (바이트 코드) 서비스, 네이티브 메소드 스택을 실행하는 스테이션을위한 가상 머신.
참고 : 기본 방법이 아닌 전화 인터페이스 자바 자바 코드입니다.

자바 堆 (자바 힙)

자바 Java 가상 머신의 힙에 의해 관리됩니다메모리의 가장 큰 조각.
Java 힙이 전부입니다스레드 주가상 머신이 시작될 때 생성되는 메모리 영역입니다.유일한 목적은 개체 인스턴스를 저장하는 것입니다자바 가상 머신 사양 설명 : 모든 객체 인스턴스와 배열은 힙에 할당합니다. 변화를 보낼 스칼라 최적화 기술을 대체하는 JIT 컴파일러 개발과 성숙 탈출 분석, 스택에 분포, 힙에 할당 된 모든 객체는 그래서 절대 아니다.
자바 가비지 컬렉터 힙 관리 힙이라고도 주 영역이다 "GC 힙." 메모리 복구의 관점에서, 자바 스택은 추가로 분류 : 신구 세대의, 조심스럽게 생존자 생존자 공간과 공간에서 공간으로 EDEN. 메모리 할당의 관점에서, 스레드 힙 버퍼 (TLAB)를 할당 전용 여러 스레드들로 분할 될 수있는 자바를 공유한다.
더 메모리 힙이 완료 인스턴스를 할당하지 않는 경우, 힙은 OutOfMemoryError가 발생합니다, 확장 할 수 없습니다.

메소드 영역 (방법 지역)

스레드 주지역, 클래스 정보 저장이 가상 머신에로드 된, 상수, 정적 변수는 시간 컴파일러는 코드 및 기타 데이터를 컴파일합니다. (하지 영구 생성 본질적으로 동등 함)

런타임 상수 풀 (런타임 상수 풀)

다양한 문자를 저장하기 위해 컴파일러에 의해 생성 및 문자 참조는 클래스가로드 된 후 저장되는 런타임 상수 풀에 직접 번역 들었다.
배치 될 수있는 새로운 상수 동작 동안 동적 클래스 문자열 예컨대 인턴 () 방법을 포함한다.

직접 메모리 (직접 메모리)

없음 가상 머신 런타임 데이터 영역의 부분도 또한 OutOfMemoryError가 발생할 수 있으며, 본 명세서에 정의되어 가상 컴퓨터 메모리 영역 것이있다.

객체, 레이아웃 및 액세스 만들기

객체 만들기

단지 새로운 키워드로 객체를 생성, 가상 머신의 과정은 다음과 같다 :
(1),이 명령의 매개 변수가 클래스 기호 참조의 정수 풀에서 찾은 클래스가로드 분석 및 초기화되었는지 여부를 확인할지 여부를 먼저 확인을 .
(2) 무부하 아니라 해당 클래스 로딩 과정의 첫 번째 구현이없는 경우.
(3) 새로운 객체 할당에 대한 가상 컴퓨터 메모리.
자바 코드의 초기 값을 지정하지 않을 수 있으므로 객체 인스턴스 필드를 보장하기 위해 할당 된 메모리 공간의 메모리 할당의 종료는 제로 값으로 초기화 후에도 (4)는, 직접적으로 사용될 수있다.
도 5는, 상기 방법의 구현 하였다 될 객체는 프로그래머의 희망에 따라 초기화된다.

================================================== =======
신생아 객체가 메모리를 할당하는 방법은 두 가지입니다 가상 머신 :
선택 할당 : Java 힙 구성 여부, 차례로, 가비지 컬렉터에 의해 사용되는 압축 할 것인지 마무리 기능을 결정합니다.
(1) 포인터 충돌
메모리를 할당 할 때 자바 힙 메모리의 구조, 물체 측의 유휴 메모리 포인터의 거리와 동일한 크기를 이동시키는 단계;
(2) 프리리스트
가능한 메모리 Java 힙 메모리는 정규없는 기록리스트 된 객체 인스턴스에 할당 충분히 큰 공간을 기록하고 배포 시간에있는 목록에서 목록을 업데이트합니다.

================================================== =======
스레드 안전 문제 : 원래 포인터를 사용하는 동안 동시 경우, 객체 A가 메모리 할당 포인터, 객체 B를 수정하려면 충분한 시간이 발생할 수 있습니다. 다음과 같은 솔루션은 다음과 같습니다 :
(1) 동기화 : 원자 업데이트 작업을 보장하기 위해 잠금.
(2) 로컬 스레드 할당 캐시 (TLAB) 메모리 할당 동작은 상이한 공간 분할 스레드 자바 각 스레드 사전 할당 힙 메모리에 따라 실시.

메모리 레이아웃 객체

오브젝트의 구조 : 객체 헤더 (헤더) 인스턴스 데이터 (예 : 데이터), 정렬 심 (패딩).
(1) 오브젝트 헤더
런타임 데이터를 저장하는)를 자체 (마크 워드) 개체 : 해시 코드 (해시)을 GC 세대 세 잠금 상태 플래그 쓰레드 로크, 스레드 ID 바이어스 바이어스 소인을 보유하고있다.
b) 타입 포인터 : 그 클래스 객체에 대한 포인터를 가상 머신은 객체 클래스의 인스턴스 포인터에 의해 결정되는, 메타 데이터이다.
데이터 (2)의 예
는 가상 머신 및 자바 소스 코드에서 정의 된 필드의 순서에 영향을 순차적으로 수신 된 할당 전략의 파라미터를 저장하는).
b) 필드와 동일한 폭을 항상 함께 할당된다.
C) 상위 클래스에 정의 된 변수는 서브 클래스 앞에 나타납니다.
(3) 배향 패딩
a) 자리 효과.
이유 : 핫스팟 VM 주소를 시작하는 객체가 8 비트의 배수 여야합니다 것을 요구, 개체의 크기는 8 비트의 배수 여야합니다.

객체의 위치에 액세스

핸들을 사용하여 (1)
안정한 기준 핸들러 주소에 저장되어있는 장점은 인스턴스 데이터에 대한 핸들 포인터만을 변화 물체 이동은 기준 자체가 변형 될 필요가있을 때.
그림 삽입 설명 여기
(2) 다이렉트 포인터
장점 : 포인터를 저장하는 속도, 시간 오버 헤드에 위치된다.
그림 삽입 설명 여기

게시 18 개 원래 기사 · 원의 칭찬 0 · 조회수 425

추천

출처blog.csdn.net/qq_33805483/article/details/104105100