当前位置: 首页 > news >正文

拱墅区建设局网站旅游网站效果图

拱墅区建设局网站,旅游网站效果图,商洛市建设工程造价管理站网站,福州网络推广运营java对象内存结构Java对象保存在堆中时,由三部分组成:对象头(object header):包括了关于堆对象的布局、类型、GC状态、同步状态和标识哈希码的基本信息。所有java对象都有一个共同的对象头格实例数据(Insta…

java对象内存结构

Java对象保存在堆中时,由三部分组成:

  1. 对象头(object header):包括了关于堆对象的布局、类型、GC状态、同步状态和标识哈希码的基本信息。所有java对象都有一个共同的对象头格

  1. 实例数据(Instance Data):主要是存放类的数据信息,父类的信息,对象字段属性信息。

  1. 数据长度(array length):记录了数组的长度(只有对象是数组时才有这个结构)。

  1. 对齐填充(Padding):为了字节对齐成的8倍数,填充的数据,不是必须的。

什么是对象头?

我们可以在Hotspot官方文档中找到它的描述。从中可以发现,它是Java对象和虚拟机内部对象都有的共同格式,由两个(计算机术语)组成。另外,如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中无法确定数组的大小。

它里面提到了对象头由两个组成,这两个分别是 mark wordklass pointer

什么是mark word

用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等。

Mark Word在32位JVM中的长度是32bit,在64位JVM中长度是64bit。

虽然它们在不同位数的JVM中长度不一样,但是基本组成内容是一致的。

  • 锁标志位(lock):区分锁状态,11时表示对象待GC回收状态, 只有最后2位锁标识(11)有效。

  • biased_lock:是否偏向锁,由于正常锁和偏向锁的锁标识都是 01,没办法区分,这里引入一位的偏向锁标识位。

  • 分代年龄(age):表示对象被GC的次数,当该次数到达阈值的时候,对象就会转移到老年代。

  • 对象的hashcode(hash):运行期间调用System.identityHashCode()来计算,延迟计算,并把结果赋值到这里。当对象加锁后,计算的结果31位不够表示,在偏向锁,轻量锁,重量锁,hashcode会被转移到Monitor中。

  • 偏向锁的线程ID(JavaThread):偏向模式的时候,当某个线程持有对象的时候,对象这里就会被置为该线程的ID。 在后面的操作中,就无需再进行尝试获取锁的动作。

  • epoch:偏向锁在CAS锁操作过程中,偏向性标识,表示对象更偏向哪个锁。ptr_to_lock_record:轻量级锁状态下,指向栈中锁记录的指针。当锁获取是无竞争的时,JVM使用原子操作而不是OS互斥。这种技术称为轻量级锁定。在轻量级锁定的情况下,JVM通过CAS操作在对象的标题字中设置指向锁记录的指针。ptr_to_heavyweight_monitor:重量级锁状态下,指向对象监视器Monitor的指针。如果两个不同的线程同时在同一个对象上竞争,则必须将轻量级锁定升级到Monitor以管理等待的线程。在重量级锁定的情况下,JVM在对象的ptr_to_heavyweight_monitor设置指向Monitor的指针。

Klass Pointer

即类型指针,是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

实例数据

如果对象有属性字段,则这里会有数据信息。如果对象无属性字段,则这里就不会有数据。根据字段类型的不同占不同的字节,例如boolean类型占1个字节,int类型占4个字节等等;

对齐填充

对象可以有对齐数据也可以没有。默认情况下,Java虚拟机堆中对象的起始地址需要对齐至8的倍数。如果一个对象用不到8N个字节则需要对其填充,以此来补齐对象头和实例数据占用内存之后剩余的空间大小。如果对象头和实例数据已经占满了JVM所分配的内存空间,那么就不用再进行对齐填充了。

所有的对象分配的字节总SIZE需要是8的倍数,如果前面的对象头和实例数据占用的总SIZE不满足要求,则通过对齐数据来填满。

为什么要对齐数据

字段内存对齐的其中一个原因,是让字段只出现在同一CPU的缓存行中。如果字段不是对齐的,那么就有可能出现跨缓存行的字段。也就是说,该字段的读取可能需要替换两个缓存行,而该字段的存储也会同时污染两个缓存行。这两种情况对程序的执行效率而言都是不利的。其实对其填充的最终目的是为了计算机高效寻址。

java对象大小的计算(我是64位计算机 JDK8)

maven 引入如下jar包

 <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.16</version></dependency>

demo code

public class ObjectTest {public static void main(String[] args) {System.out.println("****************没属性**********************");testOne testOne = new testOne();System.out.println(ClassLayout.parseInstance(testOne).toPrintable());System.out.println("****************有属性**********************");testTwo testTwo = new testTwo();System.out.println(ClassLayout.parseInstance(testTwo).toPrintable());System.out.println("****************有数组**********************");testTwo[] testTwoArr = new testTwo[]{new testTwo(),new testTwo()};System.out.println(ClassLayout.parseInstance(testTwoArr).toPrintable());}
}class  testOne{}class  testTwo{private  int a;}

结果含义

  1. OFF : 偏移地址,单位字节;

  1. SZ :占用的内存大小,单位为字节;

  1. TYPE DESCRIPTION : 类型描述,

其中object header:mark为对象头的markword;

其中object header:class为对象头的klass pointer;

其中 object alignment gap 为对齐填充

其中array length 为数组长度

由于jdk默认开启了指针压缩。
所以我们能看到object header: class 变成了4个字节。 对象头占了12个字节
可以通过配置vm参数开启关闭指针压缩,-XX:-UseCompressedOops。这时候对象头变成了16个字节****************无属性**********************
com.tongji.testOne object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4        (object header: class)    0xf800c24412   4        (object alignment gap)    
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
1.对象头mark 8个字节+对象头 klass pointer 4个字节=12字节
2.由于12不是8的整数被所以需要把12填充到8的倍数
3.最接近12的能被整除的是16故需要填充4个字节 16-12=4字节。****************有属性**********************
com.tongji.testTwo object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4        (object header: class)    0xf800cfce12   4    int testTwo.a                 0
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
1.对象头mark 8个字节+对象头 klass pointer 4个字节=12字节
2.类中int 占4个字节
3.12+4=16个字节 能被8整除故不需要填充****************数组**********************
[Lcom.tongji.testTwo; object internals:
OFF  SZ                          TYPE DESCRIPTION               VALUE0   8                               (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4                               (object header: class)    0xf800d0dc12   4                               (array length)            212   4                               (alignment/padding gap)   16   8   com.tongji.testTwo testTwo;.<elements>       N/A
Instance size: 24 bytes
Space losses: 4 bytes internal + 0 bytes external = 4 bytes total1.对象头mark 8个字节+对象头 klass pointer 4个字节=12字节
2.array length 占4个字节
3.elements 占8个字节
4.12+4+8=24字节

GC年龄为啥最大是15?大家猜猜是为啥!

看到前面的对象头的mark word 大家肯定都知道了 GC年龄无论在32位还是64位计算机只占了4位其最大值也就是 1111(二进制)=2^4-1=15.

平常常用的hashCode藏在哪里?

http://www.yayakq.cn/news/534558/

相关文章:

  • 一个专门做视频配音的网站申请域名后可以做自己的网站吗
  • 如何建立单页网站河源市seo点击排名软件价格
  • 济南网站系统优化适合网络科技的公司名字
  • 如果网站不备案网站备案几天
  • 专业的网站建设排名云软件网站建设
  • 优化网站浏览量怎么看wordpress 短信
  • 做网站推广怎么找客户做网站好还是做微信小程序好
  • html5单页网站中国建筑网建设通网站
  • 查看Wordpress的快捷键上海搜索排名优化
  • 网络公司网站建设报价电子商务网站建设市场
  • go 网站开发海宏集团网站建设
  • 江苏网站优化深圳龙华属于哪个区
  • 长沙网站设计服务免费下载微信并安装
  • 手机网站制作公司报价中国建设银行官网站和字币预约
  • 乾县做网站wordpress角色名
  • 网站后台管理页面模板定陶菏泽网站建设
  • 万盛网站制作网站后缀有哪些
  • 网站备案的好处有哪些郑州服务设计公司网站
  • 网络营销服务工具seo入门书籍推荐
  • 网站建设工作稳定吗sae网站代备案
  • 钓鱼网站模板制作网站后端性能优化措施
  • 网站建设目标的管理可行性长虹电视网站建设中
  • 网站重购临沂网站维护公司
  • 十大免费货源网站免费版权做二手车有哪些网站有哪些手续
  • 怎么做网站小图标博物建设公司网站
  • 甘肃省和城乡建设厅网站松江网站建设博客
  • 1空间做2个网站吗石家庄小学网站建设
  • 贵阳企业网站模板钉钉企业注册流程
  • 视频网站上市公司有哪些什么是网络营销战略
  • 黄石建网站p2p提供网站建设违法