JVM-005-关于对象的二三事

2020-11-14  本文已影响0人  Docker_Compose

对象的创建过程

  1. class loading
  2. class linking
  1. initializing:将静态成员变量赋初始值。
  2. 申请内存
  3. 成员变量赋默认值
  4. 调用构造方法<init>




数对象在内存的存储布局

  new了之后,对象在内存的存储布局是怎样的呢?普通对象与数组对象在内存中的存储布局有稍稍不同。
  简单来说,数组对象比普通对象多了数组长度这一项。

普通对象

  1. 对象头 markwork :8byte
  2. ClassPointer指针:默认 8 byte;使用 -XX:+UseCompressedClassPointers,则4 byte
  3. 实例数据
  1. padding对齐 :字节大小为8的倍数



数组对象

  1. 对象头 markwork :8byte
  2. ClassPointer指针:默认 8 byte;使用 -XX:+UseCompressedClassPointers,则4 byte
  3. 数组长度
  4. 数组数据
  5. padding对齐:字节大小为8的倍数




对象头包括什么

  对象头,即markwork。那么这markwork里有什么呢?markwork里中记录了锁以及GC的信息。

markwork的具体信息

markwork.png

关于hashcode的冷门小知识

  hashcode有两种情况,一种是重写了hashcode,return了一个固定值,另一种则是hashcode根据存储布局的大小来计算。
  如果对象已经计算了hashcode的值,变成IdentityHashCode后,是无法变成偏向锁




对象如何定位

  对象的定位方式有两种,一种是句柄池,另一种则是直接指针。
  对象的定位方式需要看JVM的具体实现。目前,在Hotspot中,对象的定位方式是直接指针。
  句柄池和直接指针有什么区别?句柄池比直接指针定位要快,但是直接指针有利于GC的回收。




一些不怎么重要的小知识

  1. java8大原子操作:虚拟机规范,已废弃
  2. happen-before:虚拟机规范
  3. as if serial:不管指令如何重排序,单线程的结果是不会变的
  4. 观察虚拟机的配置:java -XX:+PrintCommandLineFlags -version
上一篇 下一篇

猜你喜欢

热点阅读