如何在 Dalvik JVM 上测量 class 内存大小?

How to measure class memory size on Dalvik JVM?

阅读 'Managing You App's Memory' 文章后,我开始通过编写 "clean code" 来研究内存影响。我的意思是,例如,具有单一职责的小型 classes,针对接口编程,做一件事的方法等。

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

我猜测在创建 dex 时,或在构建版本时由 proguard 或 classloader 进行了一些优化,但是我对这个主题还很陌生。

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

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

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

应用程序难以衡量开销,因为在 Dalvik 中,大部分开销存在于本机堆或 "linear alloc" 区域(Facebook 必须 hack around). The size of the intermediate .class file is not at all representative. The size of the .dex file isn't terribly useful either because much of that lives in memory-mapped RAM, which is less of a burden to the system than "dirty" RAM (see hackbod's post 的限制)关于内存使用情况)。

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

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