Tại sao chi phí khi phân bổ các đối tượng / mảng trong Java?


9

Có bao nhiêu byte một mảng chiếm trong Java? Giả sử Đó là một máy 64 bit và cũng giả sử có các phần tử N trong một mảng, vì vậy tất cả các phần tử này sẽ chiếm 2 * N, 4 * N hoặc 8 * N byte cho các loại mảng khác nhau.

Và một bài giảng ở Coursera nói rằng nó sẽ chiếm 2 * N + 24, 4 * N + 24 hoặc 8 * N + 24 byte cho một mảng phần tử N và 24 byte được gọi là chi phí, nhưng không giải thích được tại sao chi phí đó cần thiết

Ngoài ra các đối tượng có tổng phí, là 16 byte.

Chính xác những gì là chi phí chung? 24/16 byte này bao gồm những gì?

Ngoài ra, các chi phí này chỉ tồn tại trong Java? Làm thế nào về C, C ++ và Python?



1
@Gnijuohz: Ý của bạn là hỏi: dữ liệu này bao gồm những dữ liệu nào?
Thất vọngWithFormsDesigner

@YannisRizos: Tôi nghĩ OP muốn biết những gì thực sự có trong 24 byte đó, cho các mảng.
Thất vọngWithFormsDesigner

@FrustratedWithFormsDesigner Ah, đó dường như là một cách giải thích tốt hơn cho câu hỏi so với của tôi.
yannis

@YannisRizos xin lỗi về thái độ xấu của tôi. Nhưng khi bạn đăng liên kết đó, tôi không thể không nghĩ đó là một sự mỉa mai. Quá phòng thủ, tôi đoán.
Gnijuohz

Câu trả lời:


16

Mỗi đối tượng Java có một tiêu đề chứa thông tin quan trọng đối với JVM. Quan trọng nhất là tham chiếu đến lớp của đối tượng (một từ máy) và có một số cờ được sử dụng bởi trình thu gom rác và để quản lý đồng bộ hóa (vì mọi đối tượng có thể được đồng bộ hóa) sẽ chiếm một từ máy khác (sử dụng một phần từ có hại cho hiệu suất). Vì vậy, đó là 2 từ, là 8 byte trên hệ thống 32 bit và 16 byte trên 64 bit. Ngoài ra, cần thêm một trường int cho độ dài mảng, đó là 4 byte khác, có thể là 8 trên các hệ thống 64 bit.

Đối với các ngôn ngữ khác:

  • C không có đối tượng, nên dĩ nhiên nó không có tiêu đề đối tượng - nhưng có thể có tiêu đề trên mỗi phần bộ nhớ được phân bổ riêng.

  • Trong C ++, bạn không có bộ sưu tập rác và không thể sử dụng các đối tượng tùy ý để đồng bộ hóa, nhưng nếu bạn có các lớp với các phương thức bị ghi đè, mỗi đối tượng có một con trỏ tới vtable của nó, giống như tham chiếu của đối tượng Java đến lớp của nó. Nếu bạn sử dụng con trỏ thông minh để thu gom rác, chúng cần dữ liệu vệ sinh.

  • Tôi không biết về Python, nhưng tôi khá chắc chắn rằng nó cũng cần một tài liệu tham khảo về lớp học và thông tin vệ sinh cho người thu gom rác.


Có một công việc xảy ra trong OpenJDK tại thời điểm này để giảm kích thước của các tiêu đề đối tượng, các bước nhỏ nhưng quan trọng :-)
Martijn Verburg

Trong C ++, chỉ các lớp đa hình mới cần vtables. std::pair<int, float>là một lớp đơn giản mà không cần một vtable nào cả. Kết quả là, nó có thể rất phù hợp với 8 byte. Ngoài ra, con trỏ thông minh thực sự không cần thêm dịch vụ dọn phòng. Một ví dụ rõ ràng là std::unique_ptr<T>, ví dụ điển hình chỉ lớn bằng số nguyên T*(unique_ptr tất nhiên không làm GC).
MSalters

4
C cũng có một mallocbộ nhớ , mỗi khối bộ nhớ được phân bổ cần một tiêu đề mà freesau đó sử dụng.
Herby

Ít nhất một thư viện malloc mà tôi biết sử dụng tiêu đề 8 byte trên các hệ thống 32 bit (có độ dài 4 byte được đặt trong ngoặc của hai bộ giá trị sentinel 2 byte, IIRC).
Donal Fellows
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.