Как мы все знаем, в Java 5 появилась возможность для Instrumentation легко получить размер объекта. Есть ли такой метод на Android и Dalvik?
Пакет java.lang.instrument недоступен на Android.
Ответ 1
Для чего это стоит, я просмотрел исходный код Dalvik VM и не могу найти стабильный API для получения размера объекта. Если вы хотите взглянуть на себя, размер объекта хранится в ClassObject::objectSize : size_t, см. dalvik/vm/oo/Object.h.
Существует, однако, внутренние API, чтобы получить размер объекта. Он используется DDMS для предоставления подробной информации о размерах объектов. Но, поскольку API является внутренним, он, вероятно, изменится между различными версиями Android. Кроме того, API отправляет необработанные данные byte[] и основан на клиенте/сервере, а не на простом вызове библиотеки, поэтому будет крайне неудобно использовать. Если вы хотите взглянуть, начните с dvmAllocObject() в dalvik/vm/alloc/Alloc.cpp и вызове dvmTrackAllocation().
Подводя итог: к сожалению, нет доступного, стабильного API для получения размера объекта в VM Dalvik.
Ответ 2
Для этой проблемы лучше не использовать программный подход, а использовать инструмент анализатора памяти (MAT) с сайта www.eclipse.org/mat/. Он имеет как автономную версию, так и плагин для Eclipse. С его помощью вы можете создать снимок кучи Dalvik, а затем вы можете отсортировать список объектов по их размеру, а также по размеру объектов, на которые они ссылаются (сохраненный размер). Я использовал это точно для устранения неполадок утечек кэш-карт.