머리말:
소위 객체는 실제로 Java 클래스를 통해 생성된 엔터티입니다.
예: 건물을 짓는 도면은 Java 클래스입니다. 이 도면에 따라 지어진 건물을 볼 수 있으며, 실제 사용된 기존 건물은 이 도면을 사용하여 얻은 객체와 동일합니다.
Java 클래스는 사실 추상적인 개념이고, 객체는 이 Java 클래스의 추상적인 개념을 통해 구체화된 구체적인 개념입니다.
우리의 일반적인 가상 머신인 HotSpot 가상 머신에서. 개체 구성은 개체 헤더, 인스턴스 데이터 및 정렬 패딩의 세 가지 영역으로 나뉩니다.
객체 헤더
객체 헤더는 두 부분으로 나뉩니다: 객체 자체의 런타임 데이터, 유형 포인터
객체 자체의 런타임 데이터: HashCode, 잠금 상태 플래그, 스레드가 보유한 잠금 , 편향된 스레드 ID, 기본 설정 타임스탬프, GC 생성 기간 등 이 데이터 부분의 길이는 32비트 및 64비트 가상 머신에서 각각 32비트 및 64비트입니다(압축 포인터가 활성화되지 않은 경우). 이 부분을 "마크 워드"라고 합니다.
그리고 Mark Word는 작은 공간에 더 많은 정보를 저장하기 위해 고정된 데이터 구조가 없도록 설계되었습니다. 상태에 따라 다른 데이터를 저장하게 됩니다. 예를 들어 32비트의 경우 저장소 내용은 다음과 같이 변경됩니다.
이 개체의 클래스 메타데이터에 대한 포인터인 유형 포인터를 통해 이 개체가 어떤 클래스인지 알 수 있습니다. 모든 가상 머신 구현은 클래스 메타데이터를 찾기 위해 이를 사용합니다.
HotSpot 가상 머신과 마찬가지로 일반적으로 새 개체가 생성될 때 이 참조는 개체 인스턴스의 주소를 저장합니다. 그러나 일부 가상 머신의 구현에서는 이 참조가 저장됩니다. 객체의 핸들 주소를 저장하는 경우 핸들 주소에는 객체 인스턴스 주소와 객체 유형 주소도 포함됩니다.
즉, 이러한 유형의 가상 머신에는 핸들 풀이 있으며, 핸들 풀에는 객체의 인스턴스 데이터 주소와 클래스 데이터 주소가 저장되어 있으므로 이러한 유형의 가상 머신은 클래스를 통해 해당 객체가 어떤 클래스에 속하는지 직접 알아낼 수 있습니다. 핸들 풀 인스턴스의 데이터 주소입니다.
(학습 영상 공유: java 영상 튜토리얼)
객체가 배열인 경우 데이터의 길이를 기록할 장소가 필요합니다.
인스턴스 데이터
인스턴스 데이터는 다양한 종류의 필드 내용을 포함하여 객체가 실제로 저장되는 데이터 영역입니다.
정렬된 패딩
이 부분은 다른 의미가 없으며 단지 자리 표시자 역할만 합니다. 주로 HotSpot 가상 머신의 메모리 관리에서는 개체 크기가 8바이트의 정수 배수여야 하고 개체 헤더가 필요하기 때문입니다. 8바이트의 정수배인 경우도 있지만 인스턴스 데이터가 반드시 그럴 필요는 없으므로 정렬과 패딩이 필요합니다.
저자 : yes's 레벨링 가이드
링크 : https://juejin.cn/post/6844903827427033096
출처 : Nuggets
관련 추천 : java 면접 질문과 답변
위 내용은 Java 객체의 구성을 소개합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!