2010-10-21 75 views
11

Tôi đang tính toán kích thước [bộ nhớ được sử dụng] của đối tượng java [hashmap]. Nó chứa các phần tử của các kiểu dữ liệu khác nhau [lúc chạy] vì vậy [không-of-elem * size-of-element] không phải là một cách tiếp cận tốt. Mã ngay bây giờ thực hiện theo chuỗiTính kích thước byte của đối tượng Java

if (x) 
    do something 
else if (primitives) 
    lookup size and calculate 

Tuy nhiên quá trình này là một CPU hog và hiệu quả.

Tôi đang nghĩ đến việc sau 2 cách tiếp cận thay vì:

  1. Serialize đối tượng để một bộ đệm và có được kích thước.
  2. Nhìn vào java.lang.instrument để có được kích thước

Tôi đang tìm kiếm kinh nghiệm anyones với những cách tiếp cận cho hiệu suất, hiệu quả, mở rộng quy mô vv HOẶC nếu bạn biết cách nào tốt hơn.

P.S: Đây là tiện ích nền mà tôi đang xây dựng nên kích thước không cần siêu chính xác mặc dù nó phải chính xác. Vì vậy, tôi sẵn sàng giao dịch chính xác cho hiệu suất

Tôi không quan tâm đến các vùng sâu, kích thước [kích thước của các đối tượng được refered bởi đối tượng này sẽ không được tính.]

Tôi đang tìm kiếm một so sánh hiệu suất và tìm hiểu cách getObjectSize() hoạt động trong nội bộ ..so mà tôi không messup cái gì khác để cải thiện hiệu suất

Cảm ơn

+0

Chính xác * ý của bạn là gì theo kích thước? Số lượng bộ nhớ được sử dụng? Số lượng phần tử chứa? –

+0

theo kích thước, ý tôi là số lượng bộ nhớ đã thực hiện .. chỉnh sửa để phản ánh rằng – codeObserver

+1

Câu hỏi nhiều hơn hoặc ít giống hệt nhau hơn: http://stackoverflow.com/questions/757300/programatically-calculate-memory-occupied-by-a-java- object-including-objects-it-r – andersoj

Trả lời

4

Sử dụng getObjectSize() phương pháp của gói Instrumentation.

Look here để biết chi tiết thực hiện:

+0

thnx .. Tôi đang tìm kiếm một so sánh hiệu suất và sự hiểu biết cách getObjectSize() hoạt động nội bộ .. vì vậy mà tôi không messup cái gì khác để cải thiện hiệu suất // mặc dù tôi nghĩ getObjectSize là của tôi lựa chọn tốt nhất. – codeObserver

2

Kích thước serialized chắc chắn không phải là con đường để đi, vì hai lý do:

  • Trong serialization java tiêu chuẩn có thể có khá nhiều chi phí mà sẽ thêm vào kích thước.
  • Sẽ không nhanh hơn khi sử dụng phương pháp getObjectSize() mà chúng tôi có thể đoán sẽ lặp qua tất cả các tham chiếu và sử dụng một số loại tra cứu để xác định kích thước của giá trị nguyên thủy/tham chiếu của đối tượng.

Nếu bạn cần hiệu suất tốt hơn thì điều đó thực sự sẽ phụ thuộc vào phân phối đối tượng của bạn. Một khả năng có thể là lấy một số mẫu ngẫu nhiên của các giá trị trong bản đồ của bạn, xác định mức trung bình và tính toán ước tính từ giá trị này.

Để được tư vấn về cách tra cứu giá trị ngẫu nhiên trong băm, hãy xem số question này.

+0

Thnx .. Việc lấy mẫu ngẫu nhiên có thể rất không chính xác vì giá trị trong bản đồ băm có thể khác nhau về kích thước tối đa. – codeObserver

2

Bạn có thể quan tâm đến một bài viết tôi đã viết cách đây một lúc trên how to calculate the memory usage of a Java object. Nó được thừa nhận chủ yếu nhằm vào điểm phát sóng 32-bit, mặc dù phần lớn nó được áp dụng trong các môi trường khác.

Bạn cũng có thể tải xuống đơn giản agent for measuring Java object size từ cùng một trang web sẽ thực hiện một số công việc khó khăn cho bạn và nên hoạt động trong môi trường 64 bit.Lưu ý là những người khác có tôi nghĩ rằng các hình thức serialized của một đối tượng không giống như hình thức của nó trong bộ nhớ, do đó, sử dụng serialization không phù hợp nếu bạn muốn đo lường dấu chân bộ nhớ chính xác.

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