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

时间:2015-02-12 14:16:04

标签: android memory-management dalvik

在阅读'Managing You App's Memory'文章后,我开始通过编写“干净代码”来研究内存含义。有了这个,我的意思是例如一个小职业,有一个职责,编程接口,做一件事的方法等。

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

我猜测在创建dex时会发生一些优化,或者在构建版本时通过proguard或者通过类加载器进行优化,但是我对这个主题还是比较新的。

非常感谢与文献解释Dalvik记忆模型的任何良好链接

1 个答案:

答案 0 :(得分:2)

每个类对类定义都有固定的开销,每个方法和字段都有一些字节,静态字段有一些存储空间。您可以在Dalvik来源(struct ClassObject)中看到结构。

您确实为每个类,字段和方法支付了少量费用,因此如果您使用单个巨大的方法编写整个程序,则可以节省一些空间。这不是一个好主意。 (某些代码优化器/混淆器程序会执行类似这样的操作,生成大型复杂的switch语句。)

应用程序难以测量开销,因为在Dalvik中,大部分开销都存在于本机堆上或线性分配中。区域(Facebook必须hack around的限制)。中间.class文件的大小完全没有代表性。 .dex文件的大小并不是非常有用,因为大部分内容都存储在内存映射的RAM中,这对系统的负担要小于" dirty" RAM(请参阅hackbod's post关于内存使用情况)。

我能提供的最佳建议是编写易于维护的代码,而不必担心细节问题。如果你把每一行代码放在它自己的类中,你可能会遇到麻烦,但是如果你达到那种极端状态,那么代码就很难维护。

现代应用程序中的大部分内存成本与图形有关,因为显示器不断变大和密集,而不是因为编码风格或数量。 Facebook为使其非常大的应用程序工作所做的破解是在姜饼设备上将VM缓冲区大小从5MB增加到8MB,这与应用程序的其他需求相比微不足道。