根据Java对象的内存使用:一般指南的说法:
热点:
一个普通对象需要8个字节的“内务”空间; 数组需要12个字节(与普通对象相同,加上数组长度为4个字节)。
对象粒度
在Hotspot中,每个对象占用的字节数是8的倍数。如果对象对其标头和字段所需的字节数不是8的倍数,那么您可以将下一个字节数为8。 例如,这意味着:
我的问题是:
裸露的java.lang.Object没有字段。因此,new Ojbect()在堆中将占用8个字节。
但是当我使用new Object() util测试仪表代理的大小时。
System.out.println(MemoryUtil.deepMemoryUsageOf(new Object()));结果是16,而不是8。有人能告诉我为什么吗?
编辑:
据我所知,对象标头的大小在x86上是4字节。
此外,对象标头还包含用于同步的锁信息。
// 32 bits:
// --------
// hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object)
// JavaThread*:23 epoch:2 age:4 biased_lock:1 lock:2 (biased object)
// size:32 ------------------------------------------>| (CMS free block)
// PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)因此对象的开销是4字节(对象头)+4字节(类指针)=8字节。
发布于 2014-01-28 11:17:51
这个有趣的陈述可能会给你更多的见解。
基本上,由于64位JVM中的内存对齐和填充为8字节,对象开销为16字节:每个属性(标头和类引用)需要8个字节。参见演示文稿中的幻灯片38。注但是,当使用JVM选项-XX:+UseCompressedOops时,开销将减少到12个字节。
发布于 2014-01-28 05:49:48
您发布的链接没有提到lock_type引用。见这。除了对类的引用(8个字节)外,它还将引用lock_type。还可以检查“内存使用”部分这里。
https://stackoverflow.com/questions/21397125
复制相似问题