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?
答案 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。