Kích thước của một biến tham chiếu trong java là gì. Nó có thể được tính toán?


9

Vì các con trỏ trong C yêu cầu 2 byte kích thước bộ nhớ bất kể kích thước của kiểu dữ liệu mà chúng đang trỏ. Vì vậy, điều tương tự cũng áp dụng cho các tài liệu tham khảo java?


7
trên các kiến ​​trúc hiện đại (64 bit) C yêu cầu 8 byte cho một con trỏ, java sử dụng 4 hoặc 8 tùy thuộc vào việc triển khai cơ bản (nhưng nó có thể là bất cứ điều gì miễn là ngữ nghĩa được bảo tồn)
ratchet freak


Với C, nó cũng phụ thuộc hoàn toàn vào việc thực hiện. Bạn có thể biên dịch cho 32 bit (x86 cũ đơn giản) và nhận được các con trỏ 4 byte hoặc bạn có thể sử dụng các hướng dẫn và thanh ghi 64 bit nhưng các con trỏ 4 byte (x32 ABI)!

Bạn cũng có thể tìm thấy Bố cục đối tượng Java khai sáng.
Jon Purdy

Câu trả lời:


7

Đặc tả ngôn ngữ Java không nói gì về mức độ tham chiếu trong bộ nhớ. JLS thậm chí không nói rằng một tài liệu tham khảo cần phải tồn tại trong thời gian chạy ở tất cả . Trình biên dịch có thể tự do sử dụng 42 gigabyte cho một tham chiếu hoặc loại bỏ nó hoàn toàn, làm cho kích thước 0 byte. (Trong thực tế, Đặc tả ngôn ngữ Java không bao giờ nói bất cứ điều gì về một chiến lược hoặc biểu diễn cụ thể, nó chỉ xác định cú pháp và ngữ nghĩa của các cấu trúc ngôn ngữ của Java, chứ không phải tính thực dụng của chúng.)

Hầu hết các triển khai Java điển hình sẽ đơn giản triển khai các tham chiếu như các con trỏ, do đó làm cho chúng có cùng kích thước như trong C. Đôi khi, các tham chiếu này được gọi là OOP (các con trỏ đối tượng thông thường). Nhưng ví dụ, Oracle Hotspot JVM, có một tính năng gọi là CompcedOOPs, có thể làm cho một số tham chiếu nhỏ hơn con trỏ C trên các hệ thống 64 bit.


5

Do -XX:+UseCompressedOops tùy chọn JVM HotSpot , tham chiếu đối tượng là 8 byte.

Cho phép sử dụng các con trỏ nén (tham chiếu đối tượng được biểu thị dưới dạng offset 32 ​​bit thay vì con trỏ 64 bit) để tối ưu hóa hiệu suất 64 bit với kích thước vùng heap Java nhỏ hơn 32gb.

Chúng ta có thể kiểm tra điều này bằng cách thêm một tham chiếu đến một lớp trống và đo mức sử dụng bộ nhớ của nó. Điều này cho thấy 24 byte được sử dụng trên heap. Thêm một "byte" nguyên thủy nữa, đo lại và bạn sẽ thấy 32 byte sử dụng heap.


"UseCompressionOops" là gì?
gnat

nó là một lệnh của bộ nhớ jvm, oop có nghĩa là Con trỏ đối tượng thông thường, nó cho phép chúng ta tăng kích thước heap.
Sagar Vaghela
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.