美文网首页JavaSE
JAVA并发(1)—java对象布局

JAVA并发(1)—java对象布局

作者: 小胖学编程 | 来源:发表于2019-11-23 11:43 被阅读0次

使用synchronized关键字,是锁对象还是锁代码块呢?

在hotSpot虚拟机中,对象在内存中的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。


如何查看JDK版本号.png

而实际上,对象在堆上分配的内存为8的整数倍,若对象头实例数据大小不是8的整数倍时,才需要对齐填充

如何查看对象布局

        <dependency>
            <groupId>org.jolokia</groupId>
            <artifactId>jolokia-core</artifactId>
        </dependency>
    public static void main(String[] args) {
        Account account=new Account();
        System.out.println(ClassLayout.parseInstance(account).toPrintable());
    }

2.1 对齐填充是否一定存在?

public class Account {
    //只有一个boolean的属性,即占1byte。
    boolean flag=false;  
}

打印出的对象布局:

com.tellme.lock.Account object internals:
 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4           (object header)                           43 21 f3 27 (01000011 00100001 11110011 00100111) (670245187)
     12     1   boolean Account.flag                              false
     13     3           (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total

结论:

  • 对象头部分占用12byte;
  • 实例数据部分占用的是1byte;
  • 对齐填充部分占用了3byte,将其补充为8的整数倍。
public class Account {
    //若是int类型,那么实例数据占用的是4字节
    int flag=0;   
}

重写打印对象布局:

com.tellme.lock.Account object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           43 e1 e2 27 (01000011 11100001 11100010 00100111) (669180227)
     12     4    int Account.flag                              0
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

可以看到,此时对象的布局为对象头实例数据。并不存在填充数据。

2.2 Java对象头

有上面数据可以看出,对象头大小为12byte,也就是96bit。

那么对象头又是由什么组成的呢?
点击JDK官网文档了解详情...

JVM虚拟机文档.png

可以看到,对象头由两部分组成:
1. mark word:用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、同步状态等。
2. klass pointer:对象指向它的类元数据的指针,虚拟机可以通过这个指针来确定这个对象是哪个类的实例(数组、对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通JAVA对象的元数据信息确定JAVA对象的大小,但是从数组的元数据中无法确定数组的大小)。

图1-32位HotSpot虚拟机对象头Mark Word组成.png

在mark word中分代年龄占了4bit,即分代年龄值为0-15
在JVM调优中:

  • -XX:MaxTenuringThreshold默认15。即理论上每发生一次GC,对象的分代年龄+1;
  • GC标记的锁标志位为11,是GC的markSweep(标记清除算法)使用的。

在并发编程中:

synchronize关键字对对象加锁,实际上是锁的对象,而并非对代码块进行加锁。而锁对象正是通过mark word同步标识来实现的。具体到上图中就是通过是否偏向锁+锁标识字段来控制对象的五种标识的。

image.png

注:age:保存对象的分代年龄||biased_lock:偏向锁标识位||lock:锁状态标识位||epoch:保存偏向时间戳。

不管是32/64位的JVM,都是1bit偏向锁+2bit锁标识位,来标识对象状态的。

相关阅读

JAVA并发(1)—java对象布局
JAVA并发(2)—PV机制与monitor(管程)机制
JAVA并发(3)—线程运行时发生GC,会回收ThreadLocal弱引用的key吗?
JAVA并发(4)— ThreadLocal源码角度分析是否真正能造成内存溢出!
JAVA并发(5)— 多线程顺序的打印出A,B,C(线程间的协作)
JAVA并发(6)— AQS源码解析(独占锁-加锁过程)
JAVA并发(7)—AQS源码解析(独占锁-解锁过程)
JAVA并发(8)—AQS公平锁为什么会比非公平锁效率低(源码分析)
JAVA并发(9)— 共享锁的获取与释放
JAVA并发(10)—interrupt唤醒挂起线程
JAVA并发(11)—AQS源码Condition阻塞和唤醒
JAVA并发(12)— Lock实现生产者消费者

相关文章

  • JAVA并发(1)—java对象布局

    使用synchronized关键字,是锁对象还是锁代码块呢? 在hotSpot虚拟机中,对象在内存中的布局可以分为...

  • java 内存布局

    Java 内存的布局主要是统计Java对象占用内存的大小。 Java对象的内存布局:对象头(Header)、实例数...

  • JAVA对象的创建、内存布局、 访问定位

    JAVA对象的创建、内存布局、 访问定位 时间:20180304 1.Java对象的创建详解 一个简单的创建对象语...

  • Java对象

    Java对象的内存布局?对象的访问?new对象的过程? 一、Java对象的内存布局 对象的创建过程就是在堆上分配实...

  • 对Java对象的深入认识(三)

    1. Java对象 1.1 Java对象的组成 ​ 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3...

  • Java并发教程

    Java并发教程 Java并发概述Java并发环境设置Java并发主要操作Java并发性线程间通信Java并发同步...

  • 高并发Java

    高并发Java(1):前言 高并发Java(2):多线程基础 高并发Java(3):Java内存模型和线程安全 高...

  • Java锁的原理

    引子 上锁就是改变对象的对象头?什么是对象头?----Java对象的布局----Java对象由什么组成----对象...

  • 5、Java并发编程入门与高并发面试-安全发布对象

    慕课网 Jimin老师 Java并发编程入门与高并发面试 学习笔记Java并发编程入门与高并发面试 ◆发布对象:...

  • 6、Java并发编程入门与高并发面试-线程安全策略

    慕课网 Jimin老师 Java并发编程入门与高并发面试 学习笔记Java并发编程入门与高并发面试 不可变对象需...

网友评论

    本文标题:JAVA并发(1)—java对象布局

    本文链接:https://www.haomeiwen.com/subject/uddqbctx.html