2014-09-01 80 views
5

如何有效地确定我记忆中的Date对象的大小?Java'Date'对象大小

最初,我通过这个link其中谈到9个字节约会对象去..

我试图找到它时,我发现这个链接,在那里谈论32个字节! !为内存中的日期对象。

Date Object Size in Memory

请帮助。

对这些问题的思考的原因: 我正在将数百万个特定类的对象加载到内存中进行一些计算。该类中的一个变量是Date对象。我可以将这个值存储为一个很长的值,但是这需要代码中的小怪癖。我正在考虑将内存占用降至最低。要做到这一点,我需要知道每种情况下确切的内存要求才能接受相同的呼叫。

+6

也许你可以解释一下你需要关心的问题吗? – John3136 2014-09-01 06:04:37

+2

堆空间消耗!=序列化大小,http://stackoverflow.com/questions/258120/what-is-the-memory-consumption-of-an-object-in-java – jdphenix 2014-09-01 06:08:16

+0

@ John3136添加相同。谢谢。 – LPD 2014-09-01 06:10:12

回答

2

你的第一个链接是关于序列化时的大小,你谈论的是内存大小。这就是尺寸不同的原因。

序列化,根据您的链接,保存的长度为9个字节。

在内存中,根据您的第二个链接,32个字节用于允许您使用日期的长对象和其他对象。

0

这取决于您的实施,您打算如何处理它以及如何定义和测量尺寸。例如,

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为什么包含原语的原因。最后,使用Calendar的实例并将值保留为long应该使您能够灵活地将代码更改最小化。

2

回答这个问题最简单的方法是看java.util.Date的源代码。

它只有2非静态字段(爪哇1.7.0_55):

private transient long fastTime; 
private transient BaseCalendar.Date cdate; 

long具有8个字节和cdate是具有尺寸为4个字节的对象引用的存储器大小。所以共有12字节

如果cdate将被实例化,它可能需要在额外的内存字节,但是如果你在构造看起来太,有时它甚至不会被触及,而在其他它会null -ed在年底的构造函数,所以最终的结果也是12字节

这仅用于创建Date。如果您拨打Date(例如Date.toString())的方法,那么创建对象并将其存储到cdate字段中,该字段不会被清除。因此,如果您调用Date上的某些方法,其内存使用量将会增加。

注意:在64位JVM上对象引用可能是64位长,在这种情况下,内存使用量将为16个字节。

注2:另外请注意,这仅仅是Date对象本身的内存使用情况。很可能你会在某处存储它的引用,例如在一个数组或列表或其他类中的字段中,这将需要额外的4个字节(或者在64位JVM上可能需要8个字节)。

+0

您正在查看哪个版本的Java源代码? – 2014-09-01 06:13:13

+0

@LuiggiMendoza Java 1.7.0_55。 – icza 2014-09-01 06:13:37