Java 对象的大小
Size of Java object
Java 对象的最小大小怎么可能是 8 个字节(只有对象头),
What is the memory consumption of an object in Java?
如果在C++中class表示java对象,
http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/oops/oop.hpp
我可以看到 class 有更多成员
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?
这是可能的,因为在 32 位 JVM 中 object 包含 4 个字节的标记 header 和 4 个字节的 class 引用。标记 headers 包含不同的信息,具体取决于 object 类型(大小以位为单位):
正常objects -> unused:25hash:31cms_free:1age:4biased_lock:1lock:2
偏向 objects -> JavaThread*:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2
因为header数据是二进制编码的。当通过 JVMTI 或本机调用访问此信息时,此二进制数据会分解为范围更广的数据类型。
此外,这些大小是一个实现细节,取决于 VM 的位数以及 VM 在源代码中使用 so-called compressed oops. You can read out the actual header of an instance using the JOL tool that is distributed in the OpenJDK. Also, you can find documentation of encoding of the header 的事实。
Java 对象的最小大小怎么可能是 8 个字节(只有对象头),
What is the memory consumption of an object in Java?
如果在C++中class表示java对象,
http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/oops/oop.hpp
我可以看到 class 有更多成员
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?
这是可能的,因为在 32 位 JVM 中 object 包含 4 个字节的标记 header 和 4 个字节的 class 引用。标记 headers 包含不同的信息,具体取决于 object 类型(大小以位为单位):
正常objects -> unused:25hash:31cms_free:1age:4biased_lock:1lock:2
偏向 objects -> JavaThread*:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2
因为header数据是二进制编码的。当通过 JVMTI 或本机调用访问此信息时,此二进制数据会分解为范围更广的数据类型。
此外,这些大小是一个实现细节,取决于 VM 的位数以及 VM 在源代码中使用 so-called compressed oops. You can read out the actual header of an instance using the JOL tool that is distributed in the OpenJDK. Also, you can find documentation of encoding of the header 的事实。