Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java';日期';对象大小_Java_Date_Memory - Fatal编程技术网

Java';日期';对象大小

Java';日期';对象大小,java,date,memory,Java,Date,Memory,如何有效地确定内存中日期对象的大小 最初,我讨论了日期对象的9个字节 当我找到这个链接时,我正试图找到它,在这里它谈论的是32字节用于内存中的日期对象 请帮忙 思考这些问题的理由: 我正在将某个类的数百万个对象加载到内存中,以进行一些计算。该类中的一个变量是日期对象。我可以将该值存储为long,但这需要代码中的一些小技巧。我正在考虑将内存占用保持在尽可能最小的值。要做到这一点,我需要知道每种情况下的确切内存需求,以便接听相同的电话。您的第一个链接是关于序列化时的大小,您是在讨论内存中的大小。这

如何有效地确定内存中日期对象的大小

最初,我讨论了日期对象的9个字节

当我找到这个链接时,我正试图找到它,在这里它谈论的是32字节用于内存中的日期对象

请帮忙

思考这些问题的理由:
我正在将某个类的数百万个对象加载到内存中,以进行一些计算。该类中的一个变量是日期对象。我可以将该值存储为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;