Android& Dalvik - 获取物体的大小

时间:2012-01-25 20:09:18

标签: java android dalvik

众所周知,Java 5引入了Instrumentation轻松获取对象大小的能力。在Android和Dalvik上有这样的方法吗?

Android上无法使用java.lang.instrument软件包。

3 个答案:

答案 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 LangSerializationUtils

要序列化:

byte[] data = SerializationUtils.serialize((Serializable) arrayList);
  

数据数组的长度应约为堆上的字节大小。

如上所述,这需要Commons Lang库。可以使用Gradle导入:

api 'org.apache.commons:commons-lang3:3.5'

提到了更多here

的方式