Android & Dalvik - 获取对象的大小

2022-09-01 23:46:55

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

该软件包在安卓系统上不可用。java.lang.instrument


答案 1

就其价值而言,我已经查看了Dalvik VM源代码,找不到任何稳定的API来获取对象的大小。如果你想自己看一看,一个对象的大小存储在 中,请参阅 dalvik/vm/oo/Object.hClassObject::objectSize : size_t

但是,有内部 API 可以获取对象的大小。DDMS 使用它来报告有关对象大小的详细信息。但是,由于API是内部的,因此它可能会在不同版本的Android之间发生变化。另外,API是发送原始数据的,并且是基于客户端/服务器的,而不是简单的库调用,因此使用起来会非常尴尬。如果你想看一看,从dalvik/vm/alloc/Alloc开始.cpp和调用。byte[]dvmAllocObject()dvmTrackAllocation()

总而言之:不幸的是,没有任何易于使用的稳定API来获取Dalvik VM中对象的大小。


答案 2

我获取堆上 a 的大小的想法是将对象序列化为字节数组,其中长度就是大小。ArrayList<String>

我使用了Apache Commons Lang中的。SerializationUtils

序列化:

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

数据数组的长度应大约是堆上的大小(以字节为单位)。

如前所述,这需要Commons Lang图书馆。它可以使用 Gradle 导入:

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

此处提到的更多方式


推荐