深入浅出JVM之Java对象

  1. 创建一个Java对象A的底层顺序

    1. 检查类A是否已经被加载(方法区)
    2. 执行类加载、解析、初始化
    3. 为新生对象分配内存空间
    4. 将分配的内存空间初始化为零值,基础对象赋值为默认值,引用对象赋值为null
    5. 调用对象的ini方法,static代码块
  2. 创建一个Java对象的底层步骤细节

    1. 虚拟机遇到一条new指令的时候,首先检查这个对应的类能否在常量池中定位到一个类的符号引用(是否在常量池中存在)

    2. 判断这个类是否已经被加载、解析和初始化

    3. 为这个新对象在Java堆中分配内存空间、其中Java堆分配内存空间的主要方式有以下两种

      1. 指针碰撞

        • 分配内存空间包括开辟一块内存和移动指针两个步骤

        • 非原子步骤可能出现并发问题,Java虚拟机采用CAS配上失败重试的方法保证更新操作的原子性

      2. 空闲列表

        • 分配内存空间包括开辟一块内存和修改空闲列表两个步骤
        • 非原子步骤可能出现并发问题,Java虚拟机采用CAS配上失败重试的方式保证更新操作的原子性
    4. 将分配到的内存都初始化为零值

    5. 设置对象头相关数据(GC分代年龄、对象的哈希码HashCode、元数据信息)

    6. 执行对象ini方法(静态代码块)

  3. Java对象内存布局

    1. 对象头Header,对象头用于存储对象的元数据信息,包括对象运行时数据和类型指针
      • Mark Word部分存储对象自身的运行数据如哈希值、GC分代年龄、锁状态标识、线程持有的锁、偏向锁ID、偏向锁时间戳
      • 类型指针指向它的元数据的指针、用于判断对象属于哪个类的实例
    2. 实例数据Instance Data,实例数据存储的是真正的有效数据
      • 如各种字段内容、父类定义的变量会出现子类定义的变量的前面
    3. 对齐填充Padding
      • 对其填充部分仅仅起到占位符的作用,并非必须
  4. 访问对象的定位方式

    1. 直接指针访问:局部变量表中存放的对象的指针,可以直接定位堆里面的对象的实例数据,堆中对象的类型数据执行方法区的对象的类型数据。
    2. 句柄访问:在堆里面开放一块内存用来存放句柄池, 存放对象类型的指针和对象实例的指针
  5. 两者的指针

    1. 垃圾回收分析:方式2当垃圾回收移动对象时,reference中存储的地址是稳定的地址,不需要修改,仅需要修改对象句柄的地址;方式1垃圾回收时需要修改reference中存储的地址
    2. 访问效率分析:方式1由于方式2,因为方式2只进行了一次指针定位,节省了时间开销,而这也是HotSpot采用的实现方式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我无法回答关于"深入浅出Java虚拟机PDF"的问题。但是,我可以告诉你关于Java虚拟机的一些信息。Java虚拟机(JVM)是Java程序的运行环境,它负责将Java字节码转换为机器语言并执行程序。通过使用不同的虚拟机参数,可以对JVM进行配置和调优。 通过设置-Xss参数,可以指定每个线程的Java虚拟机栈内存大小。在JDK 1.4中,默认为256K,在JDK 1.5及更高版本中,默认为1M。例如,使用java -Xss2M命令可以将线程栈内存大小设置为2M。 Java虚拟机使用ClassLoader加载类。所有其他类的加载器都是Java实现的,并继承自抽象类java.lang.ClassLoader。 当老年代空间不足时,可能会触发Full GC。但是,并不建议使用这种方式来管理内存,而是让虚拟机自行管理。因为手动执行Full GC可能会导致性能问题。 希望以上信息对你有所帮助。如果你对Java虚拟机还有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [深入浅出JAVA虚拟机](https://blog.csdn.net/loulanyue_/article/details/101075303)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值