安卓& Dalvik - 获取对象的大小

发布于 2024-12-28 20:39:36 字数 135 浏览 0 评论 0原文

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

java.lang.instrument 包在 Android 上不可用。

As we all know Java 5 introduced the ability for Instrumentation to get the size of an object with ease. Is there such a method on Android and Dalvik?

The java.lang.instrument package is not available on Android.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

和我恋爱吧 2025-01-04 20:39:36

无论如何,我查看了 Dalvik VM 源代码,但找不到任何稳定的 API 来获取对象的大小。如果你想自己看一下,对象的大小存储在ClassObject::objectSize : size_t中,请参阅dalvik/vm/oo/Object.h

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

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

For what it's worth, I have looked at the Dalvik VM source code and can not find any stable API to get the size of an Object. If you want to take a look yourself, the size of an object is stored in ClassObject::objectSize : size_t, see dalvik/vm/oo/Object.h.

There is, however, internal APIs to get the size of an Object. It is used by DDMS to report detailed information about object sizes. But, since the API is internal, it is likely to change between different versions of Android. Plus, the API is sends raw byte[] data around, and is client/server based and not a simple library call, so it will be extremely awkward to use. If you want to take a look, start in dvmAllocObject() in dalvik/vm/alloc/Alloc.cpp and the dvmTrackAllocation() call.

To sum it up: there is unfortunately not any readily usable, stable API to get the size of an Object in the Dalvik VM.

梦境 2025-01-04 20:39:36

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

我使用了 Apache Commons LangSerializationUtils

序列化:

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

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

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

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

此处提到的更多方法

My idea to get the size of a ArrayList<String> on the heap was to serialize the object into a Byte-Array, where the lengths is the size.

I've used the SerializationUtils from Apache Commons Lang.

To serialize:

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

The lenght of the data array should be approximately the size in bytes on the heap.

As mentioned, this requires Commons Lang library. It can be imported using Gradle:

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

more ways mentioned here

未蓝澄海的烟 2025-01-04 20:39:36

对于这个问题,最好不要使用编程方法,而是使用 www.eclipse.org/mat/ 上的内存分析器工具 (MAT),它有独立版本和 Eclipse 插件。使用它,您可以创建 Dalvik 堆的快照,然后您可以按对象的大小或其引用对象的大小(保留大小)对对象列表进行排序。我正是用它来解决位图缓存泄漏问题。

For this problem, it is better not to use a programatic approach but to use the Memory Analyzer Tool (MAT) from www.eclipse.org/mat/ It has both standalone version and plugin for Eclipse. With it you can create a snapshot of Dalvik heap and then you could sort the list of objects by their size or also by the size of their referenced objects (retained size). I used this exactly for troubleshooting a bitmap cache leaks.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文