简单的回答是,除非你知道这是一个问题,否则你不需要知道。
更详细的回答是,它将使用对象头的大约16个字节,每个字段4个字节(并将总和舍入为8个字节边界),即24个字节。
局部变量例如引用在堆栈上分配,并且通常不计算在内。
你通常不会关心大小的原因是,1 MB的价值约为你2秒钟的时间(比较内存的零售价格与最低工资)。这意味着你提问所花费的时间远比你可能节省的内存价值更高(在这种情况下)。
[4 GB模块的成本为18英镑,最低工资为8.5英镑,因此1 GB的价值约为0.5小时。1 MB的价值约为2秒钟。]
换句话说,如果一个简单的更改不能为你节省1 MB的内存,而你有更好的用途,那么你可能在浪费时间。
移动设备也是如此,但程度要小一些(内存成本更高,如果部署到数千台设备上,保存几百字节的总成本可能很重要)
这样做的结果是,你写
long
而不是
int
或者
double
而不是
float
(它们都有一个额外的字符)所需的时间可能比额外使用的内存值得多了。但是,我仍然建议几乎总是使用double代替float,并且常常使用long代替int,因为如果它可以节省一个bug,那么你需要键入的额外字符将会弥补更多。
衡量一个对象使用多少空间(或创建一个对象使用多少内存)最简单的方法是关闭TLAB
-XX:-UseTLAB
,并测量在创建对象之前和之后的内存量,即Runtime.totalMemory - freeMemory。
然而,在我认为它是个问题之前,我更喜欢等待数据结构出现在像YourKit(VisualVM是免费的)这样的分析器中。