2012-04-29 30 views
6

Tôi đã làm một số tiêu chuẩn so sánh hiệu suất của int vs Integer, dài so với Long, trống class instance vs class instance với giá trị dài.28 byte cho đối tượng trống/lớp thể hiện?

Và tôi có vài câu hỏi mà tôi không thể trả lời bản thân mình:

  1. tại sao tạo đối tượng của lớp rỗng hoặc đối tượng có 28 byte?
  2. instantiating đối tượng Long mất 29 byte, nguyên thủy dài 8 byte, vậy tại sao sự khác biệt cho lớp trống chỉ là 1 byte? JVM đang làm loại tối ưu hóa nào?

tôi đã sử dụng JDK1.6.0_30 trên hệ điều hành MacOS, và mã có sẵn tại https://github.com/mousator/benchmarks/blob/master/src/sk/emandem/michal/AutoboxingTypeBenchmark.java (bạn có thể kiểm toàn bộ dự án)

Cám ơn câu trả lời!

Trả lời

2
  1. Tôi sẽ không tin tưởng vào kỹ thuật đo lường bộ nhớ của bạn. Chỉ cần gọi runtime.gc() không nhất thiết phải làm bất cứ điều gì. Sử dụng công cụ như MemoryMeasurer.
  2. Mảng phát sinh chi phí của riêng chúng: thường là theo thứ tự 12 byte; tám cho tiêu đề đối tượng và bốn cho chiều dài mảng, và sau đó bốn byte cho mỗi mục nhập mảng để tham chiếu. (Đó là trên máy ảo 32 bit.)
+0

Cảm ơn câu trả lời @Louis. Tôi đã thử MemoryMeasurer, cho lớp trống tôi nhận được 20 byte, do đó, 4 byte là con trỏ mảng và 16 ví dụ (mặc dù 16 một chút lạ). Tuy nhiên, phương pháp thời gian chạy là thú vị vì nó tạo ra các phép đo khá ổn định - lặp lại lặp lại của trình tự "gọi GC, đo bộ nhớ, mã cuộc gọi, đo bộ nhớ, gọi GC" nhận được cùng một giá trị. Sự khác biệt duy nhất trong phép đo giữa thời gian chạy và MemoryMeasurer là trong lớp trống và int wrapper (cả 25B vs 20B) – mousator

+0

Tôi nhấn enter .. Vì vậy, câu hỏi tiếp theo là, tôi có thể ước tính OOME sử dụng 20 hoặc 25B? – mousator

+0

Uh. Tôi sẽ không phụ thuộc vào nó. Đơn giản hơn rất nhiều chỉ để thử nó và xem. –

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