Java对象的大小

时间:2015-03-19 11:28:32

标签: jvm openjdk

Java对象的最小大小是8字节(只有对象标头)

的可能性如何?

What is the memory consumption of an object in Java?

如果在表示java对象的C ++类中,

http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/oops/oop.hpp

我可以看到班级有更多成员

class oopDesc {
  friend class VMStructs;
 private:
  volatile markOop  _mark; // this is the object header
  union _metadata {
    wideKlassOop    _klass;
    narrowOop       _compressed_klass;
  } _metadata; // what about size of this member?

2 个答案:

答案 0 :(得分:1)

这是可能的,因为在32位JVM对象中包含4个字节的标记头和4个字节的类引用。标记头包含不同的信息,具体取决于对象类型(以位为单位):

普通对象 - > unused:25 hash:31 cms_free:1 age:4 biased_lock:1 lock:2

有偏见的物体 - > JavaThread *:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2

答案 1 :(得分:0)

因为标题数据是二进制编码的。通过JVMTI或本机调用访问此信息时,此二进制数据将分解为具有更广泛范围的数据类型。

此外,这些大小是实现细节,并且取决于VM的位数以及使用所谓的compressed oops的VM的事实而变化。您可以使用OpenJDK中分发的JOL tool读出实例的实际标头。此外,您可以在源代码中找到documentation of encoding of the header