java对象在内存的分布
(该节涉及到很多其他知识,并且实际应用中用不到,深入理解要花很多时间。我们只需要知道,为了节省64位电脑的空间,jvm会进行指针的压缩,减小对象占用大小。也会进行字段重排序。而这些背后,设计地址寻址,都有一定的规则,都可对jvm进行一些配置。太深,后期再学。)
创建对象的方式有:new,克隆,反序列化,Unsafe.allocateInstance
每次new一个对象,都会在构造器中调用父类构造器。子类对象包含所有的父类字段,只不过,父类的私有字段,子类对象不允许访问
压缩指针:
java对象头:标记字段,类型指针
标记字段:哈希码,GC信息,锁信息
类型指针:指向该对象的类。
对象头的标记字段和类型指针各站64位,额外开销大。
通过指针压缩,减少对象的内存使用量。
那么压缩自后,对象怎么寻址,会有一套自己的算法。一般来说对象的起始地址需要对齐至8的倍数(内存对齐)。用不到8的对象,空白空间浪费。
除了对象的内存对齐,字段也会进行内存对齐。原因是让字段只出现在同意cpu缓存行。不对齐的话,读取时要替换两个缓存行,存储时,会污染两个缓存行,影响程序执行效率。
字段重排序,
重新分配字段的先后顺序
原文:https://www.cnblogs.com/haiqichen/p/13693011.html