博客
关于我
深入理解Java虚拟机——对象的实例化内存布局与访问定位——超级详细篇——第四章
阅读量:326 次
发布时间:2019-03-04

本文共 1257 字,大约阅读时间需要 4 分钟。

对象的实例化与内存布局

在Java虚拟机中,对象的创建、内存布局以及访问方式是理解Java内存管理的核心内容。了解这些机制有助于我们更好地理解Java程序的运行环境。

对象的实例化

对象的实例化可以从Java字节码的执行步骤来分析。例如,以下代码段:

public class ObjectTest {    public static void main(String[] args) {        Object obj = new Object();    }}

在执行时,虚拟机会经历以下几个步骤:

  • 类加载:首先,Object类必须被加载到虚拟机中。如果类已经被加载,则会直接使用已有的类信息;如果没有,则需要进行类验证、准备和解析。

  • 内存分配:为新创建的对象分配内存。这一步可能会使用指针碰撞或空闲列表等方法,具体取决于垃圾回收器的实现和内存是否规整。

  • 初始化:分配完成后,虚拟机会将内存中的内容初始化为0。对于大多数对象,这一步可以通过本地线程分配缓冲(TLAB)来优化,减少内存碎片。

  • 设置对象头:对象头是存储对象运行时数据的区域。它包括Mark Word(用于存储哈希码、分代年龄、锁状态等信息)和类型指针(指向类的元数据)。对于数组对象,类型指针还会存储数组的长度。

  • 初始化方法:调用Objectinit方法进行初始化操作。

  • 这些步骤共同完成了对象的实例化过程。

    对象的内存布局

    在内存中,一个对象的布局可以分为三个部分:

  • 对象头(Header):包含Mark Word和类型指针。Mark Word的长度根据虚拟机实现(32位或64位)而定,用于存储对象的哈希码、分代年龄、锁状态等信息。类型指针指向类的元数据,帮助虚拟机定位对象的类型信息。

  • 实例数据(Instance Data):存储程序中定义的字段信息。字段的存储顺序和分配策略受到虚拟机的控制,例如CompactFields参数设置为true时,会尽量紧凑字段布局。

  • 对齐填充(Padding):由于Java要求对象的起始地址必须是8字节的整数倍,实例数据部分可能需要通过对齐填充来补充空缺的字节。

  • 这种内存布局设计既保证了内存的高效利用,也为垃圾回收和对象访问提供了便利。

    对象的访问定位

    在Java中,对象是通过栈上的引用(reference)来操作的。引用可以是直接指针或句柄。以下是两种访问方式的对比:

  • 使用句柄:句柄访问需要预先分配一块内存作为句柄池。句柄中存储了对象的实例数据和类型数据,引用只需存储句柄地址即可。

  • 使用直接指针:直接指针访问方式中,引用直接存储对象在堆中的地址。这种方式访问速度更快,但需要确保内存布局支持直接定位。

  • 选择哪种方式取决于具体的性能需求。句柄访问更稳定,适合频繁移动对象的情况;直接指针访问速度更快,适合对性能要求较高的场景。

    通过理解对象的实例化、内存布局和访问定位,我们可以更深入地理解Java虚拟机的内存管理机制。这些知识对于优化Java程序性能、理解垃圾回收算法等都是非常重要的。

    转载地址:http://brqq.baihongyu.com/

    你可能感兴趣的文章
    PostgreSQL Oracle 兼容性之 - pipelined
    查看>>
    PostgreSQL Point-In-Time Recovery (Incremental Backup)
    查看>>
    postgresql Streaming Replication监控与注意事项
    查看>>
    postgresql 不需要付费_使用数据传输在PostgreSQL执行 外部连接运算符
    查看>>
    postgresql 主从配置_生产环境postgresql主从环境配置
    查看>>
    postgresql 函数&存储过程 ; 递归查询
    查看>>
    PostgreSQL 分组聚合查询中 filter 子句替换 case when
    查看>>
    PostgreSQL 同步流复制锁瓶颈分析
    查看>>
    PostgreSQL 备份与还原命令 pg_dump
    查看>>
    Postgresql 外部表插件postgres_fdw的安装和使用
    查看>>
    PostgreSQL 如何从崩溃状态恢复(上)
    查看>>
    PostgreSQL 存储过程基本语法
    查看>>
    PostgreSQL 实现批量更新、删除、插入
    查看>>
    PostgreSQL 导入 .gz 备份文件
    查看>>
    PostgreSQL 批量插入&更新数据时报错(ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time)
    查看>>
    PostgreSQL 新增数据返回自增ID
    查看>>
    postgresql 更新多列数据
    查看>>
    PostgreSQL 服务启动后停止
    查看>>
    PostgreSQL 辟谣存在任意代码执行漏洞:消息不实
    查看>>
    PostgreSQL+PostGIS实现两坐标点之间最短路径查询算法函数(地图工具篇.12)
    查看>>