메모리의 자바 객체, 존재의 정확히 어떤 종류의?
이 글은, 우리는 더 자세히 살펴 봐야. 깊은 충분하지 않을 수 있습니다,하지만 우리는 장소를 이해하고 우리가 할 수 있도록 필요로하는 범위로 이동합니다.
JVM이 메모리 모델에서 첫번째보기 :
프로그램 카운터
VM 스택과 네이티브 메소드 스택
더미
메소드 영역 (런타임 상수 풀)
(사진 출처 : https://howtodoinjava.com/java/garbage-collection/jvm-memory-model-structure-and-components/ )
이것은 전체 JVM 메모리 모델의 일부이며, 그 객체는 힙 메모리 인 힙 영역에 있습니다.
우리는 지역 상점을 알고, 그게 정확히 어떻게 특정 메모리입니까? 우리는 계속한다.
참고 : 모든 기사는 JVM 특히 핫스팟 JVM은 말한다.
공정 (그냥 OOP_CLASS 볼), 매우 명확로 작성된 블로그를 읽을 상세한, 관련 내용 작성은 매우 분명하다. 사실, 사람들은 종종 내 자신의 기술을 반영하는 단어가 단어의 땅, 세계가 어려운 땅이 있어야합니다, 알리 이제 기술 전문가, 그리고 다시 한 번 15 년 졸업생의 형제에 대한 소개를 확인 읽기 경력, 당신이 그것을 너무 일찍 단어까지 할 수 있다면. 열심히 일을 계속하기 위해 최선을 다하고 있습니다.
사실, 핫스팟 소스 클라스 부분의 차례 전에,하지만 난 다시의 깊은 이해를 가지고 오늘을 인용하지 않았다.
전체 구조 봐 :
자바는 두 부분으로 JVM 개체 번 개체 자체, 아래 해당 객체 클래스가이 오브젝트 oopsHierarchy.hpp JVM 코드 대표에서 볼 수이다 :
#ifndef는 CHECK_UNHANDLED_OOPS 형식 정의 클래스 oopDesc의 *의 OOP를; 타입 정의의 클래스 instanceOopDesc * instanceOop; 타입 정의의 클래스 methodOopDesc * methodOop; 타입 정의의 클래스 constMethodOopDesc * constMethodOop; 타입 정의의 클래스 methodDataOopDesc * methodDataOop; 타입 정의의 클래스 arrayOopDesc * arrayOop; 타입 정의의 클래스 objArrayOopDesc * objArrayOop; 타입 정의 클래스 typeArrayOopDesc * typeArrayOop; 타입 정의의 클래스 constantPoolOopDesc * constantPoolOop; 타입 정의의 클래스 constantPoolCacheOopDesc * constantPoolCacheOop; 타입 정의 클래스 klassOopDesc * klassOop; 타입 정의 클래스 markOopDesc * markOop; 타입 정의의 클래스 compiledICHolderOopDesc * compiledICHolderOop; #그밖에
이러한 클래스의 대표는 다음과 같습니다 : 또한 구조와 OOP의 구조에 대한 의견을 썼다는 별도의 klass입니다
// KLASS 계층은 OOP 계층 별개입니다. 클래스 클라스; 클래스 instanceKlass; 클래스 instanceMirrorKlass; 클래스 instanceRefKlass; 클래스 methodKlass; 클래스 constMethodKlass; 클래스 methodDataKlass; 클래스 klassKlass; 클래스 instanceKlassKlass; 클래스 arrayKlassKlass; 클래스 objArrayKlassKlass; 클래스 typeArrayKlassKlass; 클래스 arrayKlass; 클래스 objArrayKlass; 클래스 typeArrayKlass; 클래스 constantPoolKlass; 클래스 constantPoolCacheKlass; 클래스 compiledICHolderKlass; #endif 다음 // SHARE_VM_OOPS_OOPSHIERARCHY_HPP
당신은 모든 객체는 가상 메서드 테이블, 분리를 유지해야 할 때 왜 별도의 주장의 C ++ 같은 다중 상태를 방지 할 수 있습니다. 우리는 사실, 객체, 또한 MarkWord에서 개체 헤더의 정의는 유형의 인스턴스입니다 instanceKlass을 볼 수 있습니다 이러한 oopDesc. 표시되는 JVM의 클래스에있는 정보의 예.
클래스 oopDesc { 친구 클래스 VMStructs; 개인 : 휘발성 markOop의 _mark; // 1 MarkWord의 조합 _metadata { // 2类型指针 wideKlassOop _klass; narrowOop _compressed_klass; _metadata}; // ...省略 전용 : // OOP 필드의 주소 공간 * field_base ( int입니다 오프셋) CONST ; jbyte * byte_field_addr는 ( int입니다 오프셋) 을 const ; jchar * char_field_addr ( int입니다 오프셋)
CONST ; jboolean에 * bool_field_addr ( int입니다 오프셋) CONST ; jint를 * int_field_addr는 ( int입니다 오프셋) 을 const ; jshort * short_field_addr는 ( int입니다 오프셋) 을 const ; jlong를 * long_field_addr ( INT 오프셋) CONST ; jfloat * float_field_addr ( INT 오프셋) CONST ; jdouble하지만 * double_field_addr ( INT 오프셋) CONST ; 주소 *의 address_field_addr (int로 오프셋) 을 const ;
이 OopDesc.hpp 코드이며, 우리는 다음과 같이 InstanceOop을 원하는
#INCLUDE는 " 죄송합니다 / oop.hpp " // instanceOop은 자바 클래스의 인스턴스 // instanceOop을 만들 것입니다 "() 새로운 해시를"평가. 클래스 instanceOopDesc : 공공 oopDesc { //省略 }; #endif 다음 // SHARE_VM_OOPS_INSTANCEOOP_HPP
분명히 instanceOopDesc가 oopDesc에서 상속을 참조하십시오. 그래서 우리는 다음 oopDesc의 구조를 분석해야합니다.
객체 헤더 (헤더) / 인스턴스 데이터 (인스턴스 데이터) / 정렬 패딩 (패딩) 세 부분 : 우리는 자바 객체의 일부입니다 알고 있습니다. MarkWord 및 지표의 유형 : 머리와 차례의 목적은 두 부분으로 구성되어있다.
코드는 명확하게 객체 헤드의 부분은 우리가 표시 한보고, 내부 아래 다양한 분야에서 인스턴스 데이터 수 있습니다.
표현 된 개체를 볼 OopDesc, 우리는 클래스 클라스는에 모습을 표현했다.