如何有效地确定我记忆中的Date对象的大小?Java'Date'对象大小
最初,我通过这个link其中谈到9个字节约会对象去..
我试图找到它时,我发现这个链接,在那里谈论32个字节! !为内存中的日期对象。
请帮助。
对这些问题的思考的原因: 我正在将数百万个特定类的对象加载到内存中进行一些计算。该类中的一个变量是Date对象。我可以将这个值存储为一个很长的值,但是这需要代码中的小怪癖。我正在考虑将内存占用降至最低。要做到这一点,我需要知道每种情况下确切的内存要求才能接受相同的呼叫。
如何有效地确定我记忆中的Date对象的大小?Java'Date'对象大小
最初,我通过这个link其中谈到9个字节约会对象去..
我试图找到它时,我发现这个链接,在那里谈论32个字节! !为内存中的日期对象。
请帮助。
对这些问题的思考的原因: 我正在将数百万个特定类的对象加载到内存中进行一些计算。该类中的一个变量是Date对象。我可以将这个值存储为一个很长的值,但是这需要代码中的小怪癖。我正在考虑将内存占用降至最低。要做到这一点,我需要知道每种情况下确切的内存要求才能接受相同的呼叫。
你的第一个链接是关于序列化时的大小,你谈论的是内存大小。这就是尺寸不同的原因。
序列化,根据您的链接,保存的长度为9个字节。
在内存中,根据您的第二个链接,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为什么包含原语的原因。最后,使用Calendar
的实例并将值保留为long
应该使您能够灵活地将代码更改最小化。
回答这个问题最简单的方法是看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个字节)。
您正在查看哪个版本的Java源代码? – 2014-09-01 06:13:13
@LuiggiMendoza Java 1.7.0_55。 – icza 2014-09-01 06:13:37
也许你可以解释一下你需要关心的问题吗? – John3136 2014-09-01 06:04:37
堆空间消耗!=序列化大小,http://stackoverflow.com/questions/258120/what-is-the-memory-consumption-of-an-object-in-java – jdphenix 2014-09-01 06:08:16
@ John3136添加相同。谢谢。 – LPD 2014-09-01 06:10:12