Java虚拟机中对象探秘--对象头创建、对象头、对象锁、synchoronized底层实现.docx
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
对象所需内存大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从java堆中划分出来。根据java堆内存是否绝对规整,划分方法不同: 1)指针碰撞(Bump the Pointer): Java堆中内存绝对规整(所有用过的内存放在一边,空闲的内存放在另一边,中间放一个指针作为分界点的指示器),所分配的内存仅需要把指针向空闲空间那边挪动一段与对象大小相等的距离。 2)空闲列表(Free List),Java堆中内存并不规整(已使用的内存和空闲的内存相互交错),虚拟机通过维护一个记录哪些内存可用的列表,在分配时从列表中找到一块中够大的空间划分给对象实例,并更新列表上的记录。 Java虚拟机(JVM)在创建和管理对象时涉及多个关键概念和技术,这些概念与对象的内存布局、对象头、对象锁以及`synchronized`关键字的底层实现密切相关。在JVM中,对象的创建过程分为几个步骤: 1. **类加载检查**:在创建对象之前,JVM会检查该类是否已经被加载、解析和初始化。如果还没有,会执行相应的类加载过程。 2. **内存分配**:对象所需内存的大小在类加载完成后即可确定。内存分配有两种主要方式: - **指针碰撞**:当Java堆内存整齐时,通过移动指针找到空闲空间并分配。 - **空闲列表**:当内存不整齐时,JVM会使用一个空闲列表来跟踪可用内存,并从中分配空间。 3. **内存初始化**:分配的内存会初始化为零值,不包括对象头,这样字段可以直接使用其类型的默认值。 4. **对象头设置**:对象头包含运行时数据,如对象的类信息、哈希码、GC信息、锁状态等。在HotSpot JVM中,对象头分为两部分:Mark Word和类型指针。 - **Mark Word**:存储对象的动态信息,如哈希码、年龄、锁状态等。在不同状态下,Mark Word可以存储不同的信息。 - **类型指针**:指向类元数据的指针,用于识别对象所属的类。 5. **实例数据**:对象的实例字段数据,包含实际的变量值。 6. **对齐填充**:为了确保对象大小是8字节的倍数,可能会添加填充数据以满足内存对齐的要求。 `synchronized`关键字的底层实现涉及到对象锁,这依赖于对象头的Mark Word。锁的状态有无锁、偏向锁、轻量级锁和重量级锁。在无锁状态下,Mark Word中存储对象的哈希码等信息。当锁升级时,锁状态标志位会改变,如转变为指向 Monitor Object 的指针,Monitor Object 是由monitorenter和monitorexit两个字节码指令进行管理的,用于实现同步。 在并发环境下,为了保证内存分配的线程安全性,JVM可能使用线程局部分配缓冲(TLAB)。每个线程在Java堆中预先分配一小片内存,这样在分配时就不需要同步锁定,只有当TLAB用完时才需要同步。 总结来说,Java虚拟机在创建和管理对象时需要考虑内存布局、内存分配策略、对象头的细节以及同步机制。这些机制保证了程序的正确性和性能,同时也是Java平台并发编程的基础。了解这些知识点对于深入理解Java程序的运行机制和优化是非常重要的。
剩余9页未读,继续阅读
- 粉丝: 254
- 资源: 1940
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助