"자바 가상 머신에 대한 심층 이해"- 개체의 탐사

로드 클래스 :

자바 가상 머신 사양, 의무가없는 로딩을 시작 할 때, 그러나, 그것은 엄격한 규칙 몇 가지 경우가 있습니다

必须进行初始化(加载,验证,准备则需要在初始化之前开始):

  • 더 클래스가 초기화되지 않을 경우, 초기화가 실행됩니다, 새로운 getstatic, putstatic, 4 invokestatic (이) 바이트 코드 지침을 만남.
  • 초기화하지 않을 경우 호출시에 대면을 반영, 첫 번째 트리거 초기화를 패키지 방식을 java.lang.reflect의 사용
  • 클래스 초기화 시간, 우리는 부모 클래스가 초기화되지 찾을 경우, 부모 클래스의 첫 번째 트리거 초기화.


클래스가 지금까지 메모리를 언로드 할 때까지 가상 컴퓨터를 시작하기 위해 메모리에로드에서 전체 라이프 사이클을 포함 :

로드 (로드), 확인 (검증), 제조 (제조), 분석 (해상도), (초기화)를 초기화 7 단계 (사용)를 사용하여, 언 로딩 (언로드). 상기 식에서, 검증, 준비와 집합 (연결) 연결 구문 분석. 프로세스는 다음과 같습니다 :


하중

로드 단계는 세 가지를 할 것입니다 :

  • 클래스의 완전한 이름으로 정의 같은 바이너리 바이트 스트림을 구하십시오.
  • 이것은 런타임 데이터 구조 영역에있어서의 정적 스토리지 구조의 바이트 스트림을 나타낸다.
  • 같은 데이터 영역 항목에 액세스하는 방법으로이 클래스의 Java 힙의 java.lang.Class 객체의 대표를 생성.

현상 모두 클래스 로더를 제공하는 시스템을 사용할 수 있기 때문에 클래스 로딩 및 로딩 단계의 다른 스테이지에 대해 제어 가능한 최강 단계이다 (즉, 동작 클래스 로딩 위상 취득 바이트의 이진 스트림이다) 로드를 완료하는 것입니다, 당신은 또한로드를 완료하는 자신의 클래스 로더를 사용자 정의 할 수 있습니다.

로딩 단계가 완료되면, 외부 저장 방법은 지역에 따라 가상 머신에 필요한 바이트의 바이너리 스트림에 가상 머신의 형식뿐만 아니라, 자바 힙의 java.lang.Class 클래스 개체를 만들고 우리가 관통 할 수 있도록 이러한 데이터 액세스 개체 영역입니다.

확인

그 검증 클래스 데이터 형식, 의미 분석, 확인 작업을 포함 확인할 수있는 유효한 바이트 코드 파일인지, 데이터 유형 JVM 사양 여부를 확인합니다.

준비된

클래스 정적 변수 메모리에 할당하고, 당신은 다음과 같은 점에주의 할 필요가 메모리 메소드 영역에 할당되는 기본 값을 초기화 :

  • 여기서 인스턴스 변수는 자바 객체 인스턴스와 힙에 할당되며, 변수 메모리 할당 만 클래스 변수 (정적)을 포함하고, 인스턴스 변수를 포함하지 않는다.
  • 여기서, 기본값은 기본 데이터 타입 (예를 들어, 널 거짓 0,0L) 코드 값이 주어진 표시 대신.
  • 마지막 정적 변형되면서 ConstatntValue 속성 클래스 필드, 즉 테이블 본 필드, 속성 경우, 속성 ConstValue 준비 스테이지 변수 값에 지정된 값으로 초기화한다.

결심

해결 단계는 가상 기계 프로세스의 상수 풀 심볼 참조를 기본 규정 클래스 또는 인터페이스 필드, 메소드 클래스 인터페이스에있어서, 입력 방법에 대한 직접적인 참조를 분석 동작을 교체하며, 상기 방법은 클래스 기준 심볼 7 점을 처리 부른다. 심볼 기준은 임의의 문자 일 수 대상을 설명하기 위해 심볼의 세트이다.

직접 참조는 객체, 측위 대상 핸들 간접 또는 상대적 오프셋에 직접 포인터이다.

초기화

진짜 시작이이 단계에서, 클래스 로딩 과정의 마지막 단계가 될 초기화합니다 java代码主导. 이 코드는 static 키워드의 모든 다시 그것의 균일 구현을 식별 정적 변수를 수행하는 경우, 그것은 사용자 지정 값 적용하기 전에 준비 단계에서 설정 한 초기 값을 사용하는 클래스에, 당신이 수행하는 경우 static代码块,那么在初始化阶段,JVM就会执行static代码块中定义的所有操作.


객체 생성 :

가상 머신에있는 반면, 단지 newkeyword 전형적 오브젝트 (복제 직렬화)을 만들고, 예를 들면 객체를 생성하는 단계 : 

① 때 새로운 명령에 가상 기회를 제공합니다. 첫 번째 파라미터는 부호 타겟팅 클래스 및 참조의 상수 풀 명령이 기호가 나타내는 클래스가로드 파싱 초기화 여부를 체크할지 여부를 확인한다. 어떤 가정. 즉 적절한 수행해야합니다 类载入过程 .


이후 검사에서 ② 클래스 로딩. 다음 학년은 가상 머신의 메모리 할당을 목표로한다. 필요한 개체 메모리 크기는 클래스 로딩 후 결정. 작업 개체의 공간을 할당하는 것과 같습니다 一块确定大小的内存从Java堆划分出来 .

  ②.① 객체를 만드는 과정은 또한 스레드 안전 문제를 고려해 볼 필요가, 실제로는 비 스레드 안전 절차입니다. 가능한 목표 포인터, 물체 B의 메모리 할당이 원래의 포인터를 사용하여 동일한 시간 변화 메모리, 충분한 시간을 할당하는 것이다. 이 문제를 해결하려면입니다 : 

  방안, 메모리 공간 할당 동기의 작동 - CAS 실제로 가상 머신 실패시 다시 시도의 방법으로 결합은 원자 업데이트 작업을 보장합니다.

  반응식 II는, 메모리 할당 동작은, 공간 분할 다른 스레드에 따라 수행된다. 즉, 각 스레드 자바에서 미리 할당 된 힙 메모리의 작은 조각이다. 로컬 스레드 할당 캐시 (TLAB)로 알려져있다. 이 TLAB에있는 스레드를 할당 할 때 메모리를 할당 할 스레드, 단지 TLAB 새로운 TLAB을 실행하고 지정했다 만 잠금을 동기화해야합니다. -XX 통해 TLAB를 사용하여 가상 머신 : +/- UseTLAB는 매개 변수를 설정합니다.


③ 메모리 후 할당. 두 시스템에 할당 된 가상 메모리 공간 初始化为零值(不包括对象头)TLAB 분포는,이 단계는 필드 오브젝트 인스턴스되도록 때 TLAB 가정은이 방법은 사전에 작동 가능 Java代码中能够不赋初始值就能直接使用,程序能訪问到这些字段的数据类型所相应的零值.


④ 다음 가상 기밀 음주 운전 对象进行必要的设置과 같은,이 객체가 어떻게 구경 메타 데이터 정보 클래스, 객체의 해시 코드, 정보의 객체 GC 세대의 나이를 찾기 위해 클래스의 인스턴스가 무엇인지. 이 정보는 개체 존재의 헤더 정보에 저장된다. 가상 머신의 다른 실행 상태에 따라. 바이어스 잠금 여부와 같은 개체는 다른 머리 배치를해야합니다. 


위의 작업이 완료되면 从虚拟机角度来看,一个新的对象已经产生了,하지만 관점에서 자바 프로그램, 객체가 이제 막 시작 - (초기화) 메소드가 실행되지 않았습니다. 모든 필드는 일반적으로도 제로이기 때문에.执行new命令后。会接着执行init方法。把对象依照程序猿的意愿进行初始化,这样一个真正可用的对象才算全然产生出来。 


메모리 레이아웃 제품 :

핫스팟 VM에서, 객체는 세 영역으로 분할 될 수있다 메모리 레이아웃에 저장된다 :

  • 개체 헤더 (헤더)
  • 데이터의 예 (예 : 데이터)
  • 정렬 패딩 (패딩)

개체 머리 핫스팟 가상 머신은 두 가지 정보로 구성

이러한 해시 코드 (해시)으로 런타임 데이터 객체 자체를 기억하는 제 1 부분은, GC 세대 세 잠금 상태 플래그 쓰레드 로크, 스레드 ID 바이어스 바이어스 소인이있는 데이터 부분을 마크라고 보유 워드.  

오브젝트 헤더 포인터 타입의 다른 부분, 즉, 그 클래스 객체에 대한 포인터를 가상 머신은 객체 클래스의 인스턴스 포인터에 의해 결정되는, 메타 데이터이다.

데이터의 예 : 중요한 정보 객체는 실제로 내용의 다양한 유형의 프로그램 코드 필드에 정의되어 저장됩니다.

정렬 필링 : 반드시 존재하지 않는 정렬 패딩을, 그것은 단지 자리에서 역할을, 특별한 의미가 없다.


액세스 개체의 위치 :

객체를 이용하여 Java 프로그램은 스택 명세서 데이터가 힙에 객체를 조작 할 필요가있는 경우.

현재 주류의 방법은 사용에 액세스 할 수 있도록 句柄하고 直接指针两种.

  • 자바 힙 핸들 등의 메모리 셀로 분할된다 손잡이 접속 후 않으면 핸들 오브젝트의 기준 주소를 저장하고, 핸들 각 데이터 타입 데이터 오브젝트의 인스턴스의 특정 주소 정보가 포함된다. 와 같이


  • 직접 액세스 포인터, 다음 자바 힙 레이아웃 객체가 데이터를 배치하는 방법에의 액세스 정보의 종류를 고려해야하는 경우와 같이, 그것은 바로, 대상 주소 참조에 저장됩니다



추천

출처juejin.im/post/5d5511475188257761189dca