java.util.Date对象使用多少字节的内存?

我需要存储大量的日期(可能足够大,以至于所使用的堆空间量是一个问题所以请不要过早优化的讲座),我想知道使用某种原始表示是否有意义java.util.Date(或其他一些现有的Date类)。 我知道我可以做一些分析来试一试,但有没有人知道单个Date对象使用的内存的确切字节数?

我的直觉反应是,Date的内存开销非常小。 检查源代码似乎该类只包含一个实例字段(一个长的称为毫秒)。 这意味着日期对象的大小是long的大小加上Object实例的大小 – 也就是说,非常小。

然后我发现这个代码创建了数千个对象来确定对象的大小。 它说java.util.Date的大小是32个字节。 相比之下,只需将日期存储为长(这是它在内部执行的操作) – 长为8个字节,因此为了方便拥有日期对象,您必须支付四倍。

但是,创建对象的开销不是很高。 因此,如果您真的担心空间,那么将日期存储为long并在需要时创建Date对象。

使用原始长?

它不是一个对象,因此空间较少,日期可以表示为长值。 然后,当您想要存储日期并使用更少的内存时,在Date和long之间来回转换。

使用java的检测框架, getObjectSize说它是24B。

如果它是字面上的日期,而不是日期和时间戳,你甚至可以使用int:

20110113

在这里也回答:

回答这个问题的最简单方法是查看java.util.Date的源代码。

它只有2个非静态字段(Java 1.7.0_55):

 private transient long fastTime; private transient BaseCalendar.Date cdate; 

long的内存大小为8个字节, cdate是一个大小为4个字节的对象引用。 所以总共12个字节

如果cdate将被实例化,它可能需要内存中的额外字节,但是如果你也看一下构造函数,有时它甚至不会被触及,而在其他情况下,它将在构造函数的末尾处为null -ed,所以最终结果也是12个字节

这仅用于创建Date 。 如果在Date上调用方法(例如Date.toString() ),那么创建一个对象并将其存储到cdate字段中,该字段将不会被清除。 因此,如果您在Date上调用某些方法,其内存使用量将会增加。

注意:对象引用在64位JVM上可能是64位长,在这种情况下,内存使用量为16个字节。

注意#2:另请注意,这只是Date对象本身的内存使用情况。 很可能你会将它的引用存储在某个地方,例如在数组或列表或某个其他类中的字段中,这将需要额外的4个字节(或64位JVM上的8个字节)。

java.util.Date对象可以用long值表示,long值是8字节-2 ^ 63到(2 ^ 63)-1

我尝试了基于以下规则的手动计算: http : //www.javamex.com/tutorials/memory/object_memory_usage.shtml并检查Java 7中Date对象的源代码的内存使用情况。

 Object overhead: 8 bytes => 8 bytes + 1 long fastTime: 8 bytes => 16 bytes + 1 reference cdate: 4 bytes => 20 bytes Rounded up to nearest multiple of 8 => 24 bytes 

也许我在计算中遗漏了一些东西,或者在其他答案中使用的工具中得到32的结果包括在计算中对日期本身的引用?