android - 如何测量 Dalvik JVM 上的类内存大小?

标签 android memory-management dalvik

看完'Managing You App's Memory'在这篇文章中,我开始通过编写“干净的代码”来研究内存影响。我的意思是,例如,有一个责任的小类、面向接口(interface)的编程、做一件事的方法等。

但是我不确定如何实际读取一个类或接口(interface)的二进制表示在 Dalvik JVM 中实际占用多少空间。我目前正在查看 intermediates 文件夹中已编译类的字节大小。在这里我可以看到,不是让一个大方法做 3 件事,而是 3 个不同的方法实际上增加了大约 100 个字节。 问题:这个措施有效吗?

我猜测在创建 dex 时,或者在构建发布时通过混淆器,或者通过类加载器进行了一些优化,但是我对这个主题还很陌生。

非常感谢任何指向解释 Dalvik 内存模型的文献的良好链接

最佳答案

每个类都有固定数量的类定义开销,加上每个方法和字段的几个字节,以及静态字段的一些存储空间。您可以在 Dalvik 源 ( struct ClassObject ) 中查看该结构。

您确实为每个类、字段和方法支付了少量费用,因此如果您将整个程序写在一个巨大的方法中,您将节省一些空间。这不是一个好主意。 (一些代码优化器/混淆器程序会做这样的事情,生成大型复杂的 switch 语句。)

应用程序难以测量开销,因为在 Dalvik 中,大部分开销存在于 native 堆或“线性分配”区域(Facebook 必须达到的限制 hack around )。中间 .class 文件的大小根本不具有代表性。 .dex 文件的大小也不是很有用,因为其中大部分位于内存映射 RAM 中,与“脏”RAM 相比,它对系统的负担更小(请参阅 hackbod's post 关于内存使用情况)。

我能提供的最好建议是编写易于维护的代码,不要过分担心细节。如果将每一行代码都放在自己的类中,您可能会遇到麻烦,但如果您走极端,代码将变得难以维护。

现代应用程序中的大部分内存成本都与图形有关,因为显示器越来越大,越来越密集,而不是因为编码风格或数量。 Facebook 为让他们的超大型应用正常运行而采取的黑客措施是在 Gingerbread 设备上将 VM 缓冲区大小从 5MB 增加到 8MB,这与应用的其他需求相比很小。

关于android - 如何测量 Dalvik JVM 上的类内存大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28479735/

相关文章:

java - 如何根据特定条件在我的 RecyclerView 上隐藏某些项目的 ImageView?

android - 将 open gl 与应用程序代码同步

c++ - 在指针的多态数组中删除和对象

c - 当我们尝试在 C 编程中将它用于多个字符串时,为什么 malloc 可以工作而 calloc 不能?

java - Java 是 Android 编程的唯一方法有什么特殊原因吗?

java - 将 Android SDK 更新到最新版本和 ADT 19

android - 如何为 Android 应用程序集成 meta io + Opencv?

android - Android中微调器的自定义布局

java - 如何使用 java 有效地加载 native 共享对象

android - Dalvik格式失败,在ServerAssistant上出现错误1