在java中,一个引用在32位jdk中占用四个字节,64位jdk是8字节。一个对象由对象头,对象实际数据,以及对齐填充(可能存在)三部分组成。
对象头: 包括_mark:markOop : 用于存储对象状态信息,比如hashcode,对象年龄(经历gc的次数),是否被当作锁同步,等等信息, 并非全部信息而是有选择性记录一些。_klass:klassOop,类元数据指针,指向一个描述自身的元数据的对象。
对象实例数据: 笼统的说,基类声明的实例字段会出现在派生类申明的实例字段之前。
java.lang.String:
_mark: markOop 4字节
_klass: klassOop 4字节
value:char[]------------------------》 typeArrayOopDesc: 在java中数组也是一个对象
offset: int _mark
count: int _klass
hash: int (哈希缓存) _length=3
[0]='h' [1]='e'[2]='l'
这揭示了string对象在内存的本质情况。
receiver.instanceMethod(), receiver实际作为隐式参数传入,《==》instanceMethod(receiver)
instance.StaticMethod() <==> instance.class.StaticMethod(), 语法糖而已。
网友评论