2014-10-14 36 views
27

Bạn có thể cho tôi một số thông tin về những gì được lưu trữ chính xác trong tiêu đề đối tượng không? Tôi biết, nó có lẽ là JVM phụ thuộc, nhưng có lẽ cho HotSpot ít nhất? Tôi đang tìm mô tả chính xác cụ thể cho hàng đầu tiên.Có gì trong tiêu đề đối tượng java

Tôi đã đọc một số thông tin mà tôi không thể xác minh tích cực với thông tin tôi tìm thấy. Có lẽ bạn có một liên kết đến OpenJDK wiki mà nói tất cả?

Trả lời

31

Đối với HotSpot:

Phần header đối tượng bao gồm một từ nhãn hiệu và một con trỏ klass.

Các dấu chữ có kích thước từ (4 byte trên 32 bit kiến ​​trúc, 8 byte trên 64 bit, kiến ​​trúc) và

các klass con trỏ có kích thước từ trên 32 bit kiến ​​trúc. Trên 64 bit kiến ​​trúc con trỏ klass có kích thước chữ, nhưng cũng có thể có 4 byte nếu địa chỉ heap có thể được mã hóa trong các 4 bytes này.

Tối ưu hóa này được gọi là "oops nén" và bạn cũng có thể kiểm soát nó bằng tùy chọn UseCompressedOops.

Bạn cũng có thể tìm thấy mục nhập wiki về số 1 này.

từ đánh dấu thực sự được sử dụng cho nhiều thứ.

  1. Một là Biased Locking2 thông qua đó HotSpot có thể triển khai khóa hiệu quả.
  2. Nó cũng được sử dụng trong GC to set forward pointersto store the age of the objects. Mã băm nhận dạng của một đối tượng có thể được lưu trữ bên trong dấu (số System.identityHashCode/Object.hashCode).

Có một bình luận trong mã nguồn của markOop.hpp mô tả cách bố trí tùy thuộc vào kiến ​​trúc:

// 32 bits: 
// -------- 
//    hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object) 
//    JavaThread*:23 epoch:2 age:4 biased_lock:1 lock:2 (biased object) 
//    size:32 ------------------------------------------>| (CMS free block) 
//    PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object) 
// 
// 64 bits: 
// -------- 
// unused:25 hash:31 -->| unused:1 age:4 biased_lock:1 lock:2 (normal object) 
// JavaThread*:54 epoch:2 unused:1 age:4 biased_lock:1 lock:2 (biased object) 
// PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object) 
// size:64 ----------------------------------------------------->| (CMS free block) 
// 
// unused:25 hash:31 -->| cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && normal object) 
// JavaThread*:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && biased object) 
// narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object) 
// unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block) 

Bạn cũng có thể tìm ra oop phần đầu tập tin here.

+3

"oop" là viết tắt của * con trỏ đối tượng bình thường * – user2418306

3

Bài trình bày sau đây sẽ cho bạn một ý tưởng chung của các nội dung đối tượng và tiêu đề đối tượng: http://www.slideshare.net/cnbailey/memory-efficient-java

Tiêu đề thực tế cho bất kỳ đối tượng là JVM nhà cung cấp, phiên bản và loại đối tượng cụ thể.

Các vấn đề liên quan