博客
关于我
Java内存管理-一文掌握虚拟机创建对象的秘密(九)
阅读量:192 次
发布时间:2019-02-27

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

Java对象创建与内存布局分析

在Java编程中,了解对象的创建过程和内存布局对于优化应用性能至关重要。本文将深入探讨Java HotSpot虚拟机中对象的创建机制、内存布局以及对象定位方式,为开发者提供全面的理论支持。

一、对象的创建过程

在Java中,创建一个对象并不仅仅是简单的`new`命令。以下是对象创建的详细过程:

  • 类加载检查

    当遇到new指令时,虚拟机首先检查该指令的参数是否能在常量池中定位到一个类的符号引用。如果无法找到,类加载器会启动类加载过程,从磁盘或其他存储介质中将类加载到虚拟机内存中。类加载过程包括验证、准备、解析和初始化等阶段,最终完成后,类才能被使用。

  • 内存分配

    在类加载完成后,虚拟机会为新对象在Java堆中分配一块确定大小的内存。Java堆是垃圾收集器管理的主要内存区域,内存分配策略主要有两种:指针碰撞和空闲列表。选择哪种方式取决于Java堆是否规整,而规整性又由垃圾收集器的压缩整理能力决定。

  • 内存初始化

    分配完成后,虚拟机会将内存空间初始化为零值。这种初始化保证了实例字段在未赋值时可以使用默认值(零值),从而提高性能和代码简洁性。

  • 对象设置

    在内存分配和初始化后,虚拟机会为对象设置必要的信息,包括对象的哈希码、GC分代年龄、锁状态等。这些信息存储在对象头中,确保对象能够被正确管理和垃圾回收。

  • 对象初始化

    最后,Java虚拟机会执行<init>方法进行对象的初始化。这一步骤将根据编写的构造函数对对象的实例字段进行初始化,完成后,一个真正可用的对象就诞生了。

  • 二、对象的内存布局

    在HotSpot虚拟机中,对象在内存中的布局分为三部分:对象头、实例数据和对齐填充。

  • 对象头

    对象头包含两个主要部分:

    • 运行时数据:存储哈希码、GC分代年龄、锁状态标志等信息。
    • 类型指针:指向类的元数据,虚拟机通过该指针确定对象所属的类。
      对于数组对象,对象头还包含数组长度信息。
  • 实例数据

    实例数据部分存储了对象的有效信息,包括字段值、方法引用等。字段的存储顺序取决于虚拟机的分配策略和Java源码中定义的顺序。

    • 非静态字段存放在堆中,静态字段存放在方法区。
    • 对于数组,元素存放在堆中的数组对象中。
  • 对齐填充

    对齐填充的作用是确保对象的起始地址是8字节的整数倍。由于对象头占用了8字节,实例数据部分需要对齐填充,以满足内存对齐的要求。对齐填充不仅提升了性能,还确保了内存的有效性。

  • 三、如何定位一个对象

    在Java程序中,对象是存储在堆中的,而变量仅在栈中存储引用。Java程序通过引用(Reference)操作堆中的对象。HotSpot虚拟机使用直接指针访问对象,以提高访问速度。

  • 直接指针访问

    在直接指针访问中,对象引用直接指向对象在堆中的地址,避免了额外的间接访问开销。这种方式对内存访问速度有显著提升。

  • 句柄访问

    另一种访问方式是使用句柄。句柄存储在引用中,包含对象的实例数据和类型数据。这种方式在对象被移动(如垃圾回收)时,仅需更新句柄中的实例数据指针,无需修改引用本身。

  • 优点对比

    • 句柄:引用稳定,适合频繁跨度操作。
    • 直接指针:访问速度更快,适合高频率的对象操作。
  • 四、本文总结

    通过本文的分析,我们了解到Java对象的创建涉及多个步骤,内存布局分为对象头、实例数据和对齐填充三部分,对象定位方式因虚拟机实现而异。理解这些机制有助于优化内存管理和垃圾回收性能,提升程序运行效率。

    如果您对某些内容有疑问或需要深入探讨,请随时留言!

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

    你可能感兴趣的文章
    Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
    查看>>
    Openlayers高级交互(13/20):选择左右两部分的地图内容,横向卷帘
    查看>>
    Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
    查看>>
    Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(18/20):根据feature,将图形适配到最可视化窗口
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    Openlayers高级交互(2/20):清除所有图层的有效方法
    查看>>
    Openlayers高级交互(20/20):超级数据聚合,页面不再混乱
    查看>>
    Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
    查看>>
    Openlayers高级交互(4/20):手绘多边形,导出KML文件,可以自定义name和style
    查看>>
    Openlayers高级交互(5/20):右键点击,获取该点下多个图层的feature信息
    查看>>
    Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
    查看>>
    Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
    查看>>
    Openlayers高级交互(8/20):选取feature,平移feature
    查看>>
    Openlayers高级交互(9/20):编辑图形(放缩、平移、变形、旋转),停止编辑
    查看>>
    Openlayers:DMS-DD坐标形式互相转换
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenLDAP(2.4.3x)服务器搭建及配置说明
    查看>>