我目前正在为Android实施一些图像处理代码。我知道内存限制,我很乐意在其中编码。但是,我找不到任何文档可以让我计算出我可能想要实例化(在堆上)的给定类的每个实例使用了多少字节。
我是一位经验丰富的C ++程序员,所以我相对有能力为我的C ++代码制定这样的结构/类大小调整问题(考虑到处理器数据路径宽度,平台对齐问题等)。我知道Java通常处于更高的抽象级别,因此我可能无法保证通用Java VM的特定内存使用。但是考虑到android在不同的VM上运行,并且考虑到开发人员对内存有很大的限制:我假设可能存在一组相对确定的规则来计算给定对象实例的大小,因为知道了成员。
任何人都知道这些规则吗?
谢谢!
亚历
答案 0 :(得分:2)
Dalvikvm的内存开销与包括HotSpot在内的其他主流32位虚拟机一致。
dalvikvm中每个对象的基本开销是两个32位字。为此,您为每个长字段或双字段添加两个单词,并为每个字段添加一个单词。静态字段不计入此总数。
如果您通过调用未重载的Object.hashCode()或System.identityHashCode()来执行标识hashCode,则可能会产生额外的开销。
如果在对象上进行同步,则会产生额外的内存开销。
答案 1 :(得分:0)
正如Jesse所指出的那样,布局与HotSpot VM非常相似。 32位热点的规则可以在这里找到: http://kohlerm.blogspot.com/2008/12/how-much-memory-is-used-by-my-java.html