我想知道
的内存消耗java.util.Date
java.time.LocalDate
org.joda.time.DateTime
我需要创建一堆具有一些日期的对象,今天它们是时间戳和 long 但这不太好,并且在另一侧创建 CPU 负载,因为我需要日期。
所以我的问题是:是否有可用的统计数据? 大概如何衡量这些东西?
最佳答案
我不担心,您需要数百万个对象才能真正在服务器上发挥作用。
但如果你真的想知道,你可以查看实现以查看每个对象的字段、每个父对象的字段等以及每个引用对象的字段)。您可以将每个字段使用的字节数 + 对象引用的大小(4 或 8 个字节,具体取决于 JVM)加上 Java 规范中描述的填充相加。
或者您可以使用第 3 方库,例如 java.sizeOf它将为您执行此操作。
但快速浏览一下您询问的类的代码,这里是字段:
日期:
private transient long fastTime;
/*
* If cdate is null, then fastTime indicates the time in millis.
* If cdate.isNormalized() is true, then fastTime and cdate are in
* synch. Otherwise, fastTime is ignored, and cdate indicates the
* time.
*/
private transient BaseCalendar.Date cdate;
long
+ 对其他类的引用,它有自己的字段等。但是,在阅读大量代码之后,cdate
几乎总是 null
所以我们只需要计算对象引用的大小(为空),我认为当使用 32 位时,对象的大小不会膨胀超过 24 字节的填充,或者如果在 64 位上,使用压缩操作尽可能使用 4 字节引用而不是 8 字节引用。 (我认为这是 Java 8 的默认设置)所以我们可以忽略它。
本地日期:
/**
* The year.
*/
private final int year;
/**
* The month-of-year.
*/
private final short month;
/**
* The day-of-month.
*/
private final short day;
因此 int+short+short
的大小与 long
相同,但您必须考虑您保留的每个 LocalDate
引用的内存周围。
日期时间:
private long iMillis;
private Chronology iChronology;
这也是 long
+ object ref 到其他占用内存的对象。
使用 SizeOf
当我创建每个对象的实例并在我的 64 位 Java 8 JVM 上对它们使用 java.sizeOf 时,我得到以下内存大小(以字节为单位):
javaDate = 24
localDate = 24
dateTime = 16928
如您所见,jodatime 及其所有支持类占用了大量内存。但是,当您有其他实例时,其中大部分将被重用。
因此,如果它们没有包装在类中,我会继续使用您的 long
。但是,如果您将 long
包装在一个类中,或者甚至使用 Long
,LocalDate
似乎是最好的,因为它具有相同数量的内存加上所有支持用于转换/时区等的类。我不会使用 Date
,因为该类是可变的,应该被视为已弃用。
关于java - 内存消耗 java.util.Date vs java.time.LocalDate vs org.joda.time.DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24937618/