Java';日期';对象大小
如何有效地确定内存中日期对象的大小 最初,我讨论了日期对象的9个字节 当我找到这个链接时,我正试图找到它,在这里它谈论的是32字节用于内存中的日期对象 请帮忙 思考这些问题的理由:Java';日期';对象大小,java,date,memory,Java,Date,Memory,如何有效地确定内存中日期对象的大小 最初,我讨论了日期对象的9个字节 当我找到这个链接时,我正试图找到它,在这里它谈论的是32字节用于内存中的日期对象 请帮忙 思考这些问题的理由: 我正在将某个类的数百万个对象加载到内存中,以进行一些计算。该类中的一个变量是日期对象。我可以将该值存储为long,但这需要代码中的一些小技巧。我正在考虑将内存占用保持在尽可能最小的值。要做到这一点,我需要知道每种情况下的确切内存需求,以便接听相同的电话。您的第一个链接是关于序列化时的大小,您是在讨论内存中的大小。这
我正在将某个类的数百万个对象加载到内存中,以进行一些计算。该类中的一个变量是日期对象。我可以将该值存储为long,但这需要代码中的一些小技巧。我正在考虑将内存占用保持在尽可能最小的值。要做到这一点,我需要知道每种情况下的确切内存需求,以便接听相同的电话。您的第一个链接是关于序列化时的大小,您是在讨论内存中的大小。这就是尺寸不同的原因 根据您的链接,已序列化9个字节用于保存的长文件
在内存中,根据您的第二个链接,long和其他允许您处理日期的对象的字节数为32。这取决于您的实现、您打算使用它做什么以及如何定义和测量大小。比如说,
public static void main(String[] args) {
Date d = new Date();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(baos);) {
oos.writeObject(d);
oos.flush();
} catch (Exception e) {
e.printStackTrace();
}
byte[] written = baos.toByteArray();
System.out.println(written.length);
}
输出
46
在这里
编辑
使用原语
long
将始终比任何对象类型(Date
包括在内)使用更少的内存。这就是Java包含原语的根本原因。最后,使用的一个实例并将值保持为长
应该可以让您灵活地最小化代码更改。回答此问题的最简单方法是查看java.util.Date
的源代码
它只有2个非静态字段(Java 1.7.0_55):
long
的内存大小为8字节,cdate
是一个大小为4字节的对象引用。因此总共有12个字节
如果要实例化cdate
,它可能需要内存中额外的字节,但如果您也查看构造函数,有时它甚至不会被触碰,而在其他情况下,它将在构造函数末尾被null
,因此最终结果也是12字节
这仅用于创建日期
。如果调用日期
上的方法(例如Date.toString()
),则将创建一个对象并将其存储到cdate
字段中,该字段不会被清除。因此,如果您在日期
调用某些方法,它的内存使用将增加
注意:在64位JVM上,对象引用的长度可能为64位,在这种情况下,内存使用量为16字节
注意#2:还要注意,这只是
日期
对象本身的内存使用情况。您很可能会将其引用存储在某个位置,例如数组、列表或其他类中的某个字段中,这将需要额外的4个字节(或者64位JVM上可能需要8个字节)。也许可以解释一下您需要关心的问题?堆空间的消耗!=序列化大小,@John3136添加了相同的大小。谢谢。如果你已经加载了数百万个日期对象,可能你会使用int值,符合你的要求。例如最大日期范围或时间分辨率等。您正在查看哪个版本的Java源代码?@LuiggiMendoza Java 1.7.055。
private transient long fastTime;
private transient BaseCalendar.Date cdate;