众所周知,Java 5引入了Instrumentation轻松获取对象大小的能力。在Android和Dalvik上有这样的方法吗?
Android上无法使用java.lang.instrument
软件包。
答案 0 :(得分:13)
为了它的价值,我查看了Dalvik VM源代码,找不到任何稳定的API来获取Object的大小。如果您想自己查看一下,对象的大小存储在ClassObject::objectSize : size_t
中,请参阅 dalvik / vm / oo / Object.h 。
但是,内部 API可以获取Object的大小。 DDMS使用它来报告有关对象大小的详细信息。但是,由于API是内部的,因此可能会在不同版本的Android之间进行更改。此外,API会发送原始byte[]
数据,并且基于客户端/服务器,而不是简单的库调用,因此使用起来非常尴尬。如果您想查看一下,请从 dalvik / vm / alloc / Alloc.cpp 和dvmAllocObject()
电话中的dvmTrackAllocation()
开始。
总结一下:遗憾的是,没有任何易于使用的稳定API可以在Dalvik VM中获得Object的大小。
答案 1 :(得分:0)
对于这个问题,最好不要使用编程方法,而是使用www.eclipse.org/mat/上的Memory Analyzer Tool(MAT)。它有Eclipse的独立版本和插件。有了它,您可以创建Dalvik堆的快照,然后您可以按其大小或按引用对象的大小(保留大小)对对象列表进行排序。我完全用它来解决位图缓存泄漏问题。
答案 2 :(得分:0)
我要在堆上获得ArrayList<String>
大小的想法是将对象序列化为字节数组,长度是大小。
我使用了来自Apache Commons Lang的SerializationUtils
。
要序列化:
byte[] data = SerializationUtils.serialize((Serializable) arrayList);
数据数组的长度应约为堆上的字节大小。
如上所述,这需要Commons Lang库。可以使用Gradle导入:
api 'org.apache.commons:commons-lang3:3.5'
提到了更多here
的方式