java - 内存消耗 java.util.Date vs java.time.LocalDate vs org.joda.time.DateTime

标签 java datetime memory java-8

我想知道

的内存消耗
  • 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 包装在一个类中,或者甚至使用 LongLocalDate 似乎是最好的,因为它具有相同数量的内存加上所有支持用于转换/时区等的类。我不会使用 Date,因为该类是可变的,应该被视为已弃用。

关于java - 内存消耗 java.util.Date vs java.time.LocalDate vs org.joda.time.DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24937618/

相关文章:

java - JTable.columnMoved 方法的一个错误

java - java中是否有相当于Path.IsPathRooted()的函数?

mysql - 当mysql中的datetime列到达当前时间时,如何自动执行程序?

ios - dispatch_group 中的内存泄漏

django+uwsgi 巨大的内存使用问题

java - 如何比较java中数组中的空元素?

java - 将局部变量添加到方法中会使它们变慢吗?

python - 使用 Numpy datetime64 对象索引/切片 Pandas DataFrame

python - 从实例方法更改日期时间字段的值

c - 如何就地修改项目(无需复制/传递缓冲区)