2012-01-25 48 views
18

Như chúng ta đều biết Java 5 đã giới thiệu khả năng Instrumentation để có được kích thước của một đối tượng một cách dễ dàng. Có một phương pháp như vậy trên Android và Dalvik không?Android & Dalvik - Nhận kích thước của một đối tượng

Gói java.lang.instrument không khả dụng trên Android.

+0

Kiểm tra điều này: http://www.javapractices.com/topic/TopicAction.do?Id=83 – slayton

+0

Trông và cảm thấy giống như một vụ hack ngu ngốc ... Tôi đã đi với câu trả lời của Samuel. –

+0

Chỉ cần tò mò ... trường hợp sử dụng thực tế của bạn là gì? –

Trả lời

12

Đối với những gì nó có giá trị, tôi đã xem mã nguồn VM Dalvik và không thể tìm thấy bất kỳ API ổn định nào để có được kích thước của một đối tượng. Nếu bạn muốn tự xem, kích thước của vật thể được lưu trữ trong ClassObject::objectSize : size_t, xem dalvik/vm/oo/Object.h.

Có, tuy nhiên, nội bộ API để nhận kích thước của một đối tượng. Nó được DDMS sử dụng để báo cáo thông tin chi tiết về kích thước đối tượng. Tuy nhiên, vì API là nội bộ nên có khả năng thay đổi giữa các phiên bản Android khác nhau. Thêm vào đó, API sẽ gửi dữ liệu byte[] thô xung quanh và là máy khách/máy chủ dựa và không phải là cuộc gọi thư viện đơn giản, vì vậy nó sẽ vô cùng khó xử khi sử dụng. Nếu bạn muốn xem, hãy bắt đầu bằng số dvmAllocObject() trong số dalvik/vm/alloc/Alloc.cpp và cuộc gọi dvmTrackAllocation().

Tóm lại: có thể không có bất kỳ API có thể sử dụng, ổn định nào để có được kích thước của một đối tượng trong máy ảo Dalvik.

+0

Nhấn jackpot, dvmAllocObject là hàm được gọi khi sử dụng toán tử mới. Đối với kích thước, đó là một điều đúng, người dùng ứng dụng có thể nhận được kích thước. –

0

Đối với vấn đề này, tốt hơn là không sử dụng phương pháp lập trình nhưng sử dụng Công cụ phân tích bộ nhớ (MAT) từ www.eclipse.org/mat/ Nó có cả phiên bản độc lập và plugin cho Eclipse. Với nó, bạn có thể tạo một snapshot của heap Dalvik và sau đó bạn có thể sắp xếp danh sách các đối tượng theo kích thước của chúng hoặc cũng bằng kích thước của các đối tượng tham chiếu của chúng (kích thước được giữ lại). Tôi đã sử dụng chính xác điều này để khắc phục sự cố rò rỉ bộ nhớ cache bitmap.

+0

Ông đang tìm cách tính kích thước của một đối tượng ** tại thời gian chạy **. –

+1

Giải pháp tôi đề xuất hoạt động chính xác khi chạy. – WindRider

-7
int length =processes.size(); 

trả về kích thước của đối tượng.

+1

Loại ** quy trình nào **? Điều này có vẻ không hữu ích chút nào. –

+1

Không trả lời câu hỏi trên – milosmns

+1

Tôi đoán bạn đang nghĩ rằng các quá trình là một ArrayList hoặc một cái gì đó. –

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