热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2、深入理解JVM中Java对象的创建、对象结构、以及对象访问定位

2、JVM-Java对象的创建、对象结构、对象访问定位,Go语言社区,Golang程序员人脉社

目录

给对象分配内存(两种)

对象结构

对象的访问定位


 


记录下来方便个人学习复习

  • 注:根据new的参数在常量池中定位一个类的符号引用 --这句话的意思是:常量池相当于c语言中的指针地址集合,所以就是在常量池中保存new对象的地址,通过地址定位对象在堆中的位置

  • 给对象分配内存(两种)

    • 指针碰撞的方式(内存比较规整的情况下)

  • 空闲列表的方式(内存不规整的情况下)

内存是否规整取决于垃圾回收器的策略,当垃圾回收时压缩整理了内存,在内存分配时就是使用内存碰撞的方式

  • 线程安全性问题

    • 线程同步

    • 本地线程分配缓冲

      • 多线程的情况下对象在分配内存的过程中会出现线程安全的问题,所以当每个一线程进来的时候虚拟机都会为每一个线程分配一块独立的内存空间,称之为本地线程分配缓冲


对象结构

  • Header(对象头)

    • 自身运行时数据(Mark Word)

      • 哈希值、GC分代年龄、锁状态标志、线程持有的锁、偏向线程id、偏向时间戳

    • 类型指针

  • InstanceData(实例数据)

  • Padding(队形填充)

    • 对象的创建有指定的大小,比如int类型4个字节,如果数据没有4个字节,现在就需要使用padding填充对象到4个字节


对象的访问定位

  • 句柄

    • 堆中的句柄池保存着堆中对象的实例指针(和对象类型数据的指针,这个指针指向方法区),栈中的对象引用指向这个句柄池,句柄池中的对象指针指向对象实例。所有句柄也叫指针的指针

  • 直接指针

    • 栈中对象的引用直接指向堆中的对象实例(直接指针也保存着对象实例指针和对象数据类型指针)

句柄需要先指向句柄池找到对象实例的地址,再找到对象的实例,需要2步,直接指针直接指向对象的实例,需要1步即可。那么为什么还会有句柄的方式,因为如果对象发生改变(为什么会改变?因为gc算法,当复制或者整理的时候对象实例会移动在堆中的地址)栈中指向句柄池的地址不需要改变,改变的都是句柄池中的地址(句柄池和对象实例都是在堆中,所以在改变句柄池的实例指针就比改变栈中的应用指针方便)。使用直接指针的方式比句柄的方式快,Hotspot使用的是直接指针的方式

                                                                                      注:博文内容来自书本《深入理解Java虚拟机》第2版 周志明著


推荐阅读
author-avatar
黑白
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有