博客
关于我
深入理解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/

    你可能感兴趣的文章
    nodejs端口被占用原因及解决方案
    查看>>
    Nodejs简介以及Windows上安装Nodejs
    查看>>
    nodejs系列之express
    查看>>
    nodejs系列之Koa2
    查看>>
    Nodejs连接mysql
    查看>>
    nodejs连接mysql
    查看>>
    NodeJs连接Oracle数据库
    查看>>
    nodejs配置express服务器,运行自动打开浏览器
    查看>>
    NodeMCU教程 http请求获取Json中文乱码解决方案
    查看>>
    Nodemon 深入解析与使用
    查看>>
    NodeSession:高效且灵活的Node.js会话管理工具
    查看>>
    node~ http缓存
    查看>>
    node不是内部命令时配置node环境变量
    查看>>
    node中fs模块之文件操作
    查看>>
    Node中同步与异步的方式读取文件
    查看>>
    node中的get请求和post请求的不同操作【node学习第五篇】
    查看>>
    Node中的Http模块和Url模块的使用
    查看>>
    Node中自启动工具supervisor的使用
    查看>>
    Node入门之创建第一个HelloNode
    查看>>
    node全局对象 文件系统
    查看>>