看完'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/