자바 객체 모델

메모리의 자바 객체, 존재의 정확히 어떤 종류의?

이 글은, 우리는 더 자세히 살펴 봐야. 깊은 충분하지 않을 수 있습니다,하지만 우리는 장소를 이해하고 우리가 할 수 있도록 필요로하는 범위로 이동합니다.

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의 클래스에있는 정보의 예.

코드 링크 : https://github.com/openjdk-mirror/jdk7u-hotspot/blob/50bdefc3afe944ca74c3093e7448d6b889cd20d1/src/share/vm/oops/oopsHierarchy.hpp

클래스 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, 우리는 클래스 클라스는에 모습을 표현했다.

추천

출처www.cnblogs.com/aquariusm/p/11201913.html