我需要存储大量的日期(可能足够大,以至于所使用的堆空间量是一个值得关注的问题所以请不要过早优化的讲座),我想知道使用某种类型的日期是否有意义原始表示而不是java.util.Date(或其他一些现有的Date类)。我知道我可以做一些分析来尝试一下,但有没有人知道单个Date对象使用的内存的确切字节数?
答案 0 :(得分:15)
我的直觉反应是Date的内存开销非常小。检查源代码似乎该类只包含一个实例字段(一个长的称为毫秒)。这意味着日期对象的大小是long的大小加上Object实例的大小 - 也就是说,非常小。
然后我发现this code创建了数千个对象来确定对象的大小。它说java.util.Date
的大小是32个字节。相比之下,只需将日期存储为长(这是内部的作用) - 长为8个字节,因此为了方便拥有日期对象,您必须支付4倍。
但是,创建对象的开销不是很高。因此,如果您真的担心空间,那么将日期存储为long并在需要时创建Date对象。
答案 1 :(得分:9)
使用原始多长?
它不是一个对象,因此空间较少,日期可以表示为长值。然后,当你想存储日期并使用更少的内存时,在Date和long之间来回转换。
答案 2 :(得分:3)
使用java的instrumentation框架,getObjectSize表示它是24B。
答案 3 :(得分:1)
如果它是字面上的日期,而不是日期&时间戳,你甚至可以使用int:
20110113
答案 4 :(得分:1)
同样回答here:
回答这个问题的最简单方法是查看java.util.Date
的源代码。
它只有2个非静态字段(Java 1.7.0_55):
private transient long fastTime;
private transient BaseCalendar.Date cdate;
long
的内存大小为8个字节,cdate
是一个大小为4个字节的对象引用。总共 12个字节。
如果cdate
将被实例化,它可能需要内存中的额外字节,但是如果你也看一下构造函数,有时它甚至不会被触及,而在其他情况下它将是{{ 1}} - 在构造函数的末尾编辑,因此最终结果也是 12个字节。
这仅用于创建null
。如果您在Date
上调用方法(例如Date
),那么将创建并将对象存储到Date.toString()
字段中,该字段将不会被清除。因此,如果您在cdate
上调用某些方法,其内存使用量将会增加。
注意: 64位JVM上的对象引用可能是64位长,在这种情况下,内存使用量为16个字节。
注意#2:另请注意,这只是Date
对象本身的内存使用情况。很可能你会在某处存储它的引用,例如在一个数组或列表或某个其他类中的字段,这将需要额外的4个字节(或64位JVM上的8个字节)。
答案 5 :(得分:0)
java.util.Date对象可以用long值表示,long值是8字节-2 ^ 63到(2 ^ 63)-1
答案 6 :(得分:0)
我尝试了基于这里规则的手动计算: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个,其中包括对计算中日期本身的引用?