精华内容
下载资源
问答
  • 对象访问定位

    2021-05-09 16:34:52
    Java程序会通过栈帧中的reference数据来操作堆上的具体对象,主流的对象访问方式有两种: 使用句柄访问 直接指针访问 1. 使用句柄 Java堆中可能会划分处一块内存来作为句柄池,reference中存储的就是对象的句柄...

    Java程序会通过栈帧中的reference数据来操作堆上的具体对象,主流的对象访问方式有两种:

    • 使用句柄访问
    • 直接指针访问

    1. 使用句柄

    Java堆中可能会划分处一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄包含了对象实例数据与类型数据各自具体的地址信息。

    image.png

    优点:对象被移动时只会改变句柄中实例数据指针,reference本身无需更改

    2. 直接指针

    reference中存储对象地址,HotSpot使用此种访问方式

    image.png

    优点:访问速度快,节省一次指针定位的时间开销

    展开全文
  • HotSpot虚拟机对象探秘(对象创建,对象内存布局,对象访问定位) 以常用的HotSpot虚拟机和JAVA内存区域堆为例,探讨对象的创建,对象的内存布局以及对象的访问定位一.对象的创建1)类加载:虚拟机...

    HotSpot虚拟机对象探秘(对象创建,对象内存布局,对象访问定位)

    以常用的HotSpot虚拟机和JAVA内存区域堆为例,探讨对象的创建,对象的内存布局以及对象的访问定位


    一.对象的创建

    1)类加载:虚拟机遇到一条new指令时,先检测这个指令的参数能否在常量池中定位到一个类的符号的引用,并检查这个符号代表的类否收以及被加载,解析和初始化,如果没有那么就必须执行相应的类加载过程

    2)分配内存:如果java堆的内存是绝对规整的,那么采用指针碰撞的方式分配内存,即所有空闲的内存放一边,不空闲的内存放一边,中间放着一个指针作为分界点的指示器,分配内存就仅仅是把那个指针向空闲的空间那边挪动一段与对象大小相等的距离,如果java堆的内存是不规整的话,那么我们必须维护一个空闲列表,记录哪些内存块是可用的,在分配的时候从列表中找到一个足够大的空间划分给对象实例,并更新列表上的记录

    3)初始化:都初始化为0(不包括对象头),这一步操作保证了对象的实例字段在java代码中可以不赋初始值就直接使用

    4)对象头的设置:对象是那个类的实例,如何找到类的元数据,对象的哈希码,对象的GC分代年龄,以及是否启动偏向锁等

    5)程序员按照自己的意愿进行对象初始化


    思考:对象的创建在虚拟机中是频繁的行为,如何保证并发情况下的线程安全呢?

    比如正在给对象A分配内存,指针还没有来得及修改,对象B又同时使用了原来的指针分配内存

    解决方案:

    1)对分配内存空间的动作进行同步:实际上虚拟机采用CAS配上失败重试的方式保证更新操作的原子性

    2)把内存分配的动作按照线程的不同划分在不同的空间进行:每个线程在java堆中预先分配一块内存,称为本地线程分配缓存TLAB,那个线程需要分配内存,就在那个线程的TLAB上分配,只用TLAB分配完并分配先新的TLAB时,才需要同步锁定


    二.对象的内存布局

    在HotSpot虚拟机中,对象在内存区域中存储布局可以分为3个区域:对象头,实例数据,对齐补充


    对象头:又分为Mark Word和类型指针,Mark Word存储哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等

    ,类型指针即对象指向它的类元数据的指针,虚拟机通过这个指针确定这个对象是哪个类的实例


    实例数据:对象真正储存的有效信息,也就是在程序代码中所定义的各种类型的字段内容,无论是从父类继承来的,还是在子类中定义的,都需要记录来


    对齐补充:并不是必然存在的,因为HotSpot要求对象的起始地址必须是8字节的整数倍,也就是对象的大小必须是8字节的整数倍,而对象头部分正好是8字节的整数倍,所以当对象的实例数据部分没有对齐时,就需要通过对齐补充来补全


    三.对象的访问定位

    java程序通过栈上的reference数据来操作堆上的具体对象,由于reference类型在java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过何种方式去定位从而访问堆中的对象元素的具体位置,所以对象的访问方式是取决于虚拟机实现的,目前主流的方式有使用句柄和直接指针两种


    句柄方式:堆中划分一块内存作为句柄池,reference中储存的就是对象的句柄地址,而对象的句柄地址中包含了对象的实例数据与类型数据各自具体的地址信息


    直接指针:reference中储存的就是对象地址,java堆对象的布局需要考虑如何放置访问类型数据的相关信息


    优劣分析:

    1.使用句柄的最大好处就是reference中储存的是稳定的句柄地址,在对象被移动(垃圾收集时对象移动是非常普遍的行为)时只会改变句柄中实例数据指针,而refrence本身不需要修改

    2.直接指针访问最大好处就是速度更快,节省了一次指针定位的时间开销,由于对象的访问在java中非常频繁,积累下来也是一笔很大的时间开销


    参考书籍:深入理解JAVA虚拟机 java高级特性与最佳实践 第二版



    posted @ 2019-03-28 10:20 Y先森0.0 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • Java对象访问定位笔记图 建立对象是为了使用对象,Java程序需要通过栈上的reference数据来操作堆上的具体对象。 reference类型在Java虚拟机规范中只规定了一个指向对象的引用,而对象访问方式是取决于虚拟机实现而...
    对象访问定位
    Java对象访问定位笔记图

    建立对象是为了使用对象,Java程序需要通过栈上的reference数据来操作堆上的具体对象。

    reference类型在Java虚拟机规范中只规定了一个指向对象的引用,而对象访问方式是取决于虚拟机实现而定的。

    目前主流的访问方式有:使用句柄、直接指针。

    展开全文
  • 这就用到本文所讲述的对象访问定位。 建立对象是为了使用数据,我们的Java程序需要通过栈上的reference数据来操作堆上的具体对象。由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这哥...

    当我们创建完成对象之后要使用对象,那么我们如何找到这个对象呢?这就用到本文所讲述的对象访问定位。

    建立对象是为了使用数据,我们的Java程序需要通过栈上的reference数据来操作堆上的具体对象。由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这哥引用应该通过何种方式去定位,访问堆中的对象的具体位置,所以对象访问方式也是取决于虚拟机的实现而定的。目前流行的有两种方式。

    对象访问定位

    • 使用句柄
    • 直接指针

    句柄访问

    如果使用句柄访问的话,那么Java堆将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象的实例数据与类型数据各自的具体地址信息。

    直接指针

    如果使用直接指针访问,那么Java堆对象的布局中就要考虑如何放置访问类型数据的相关信息,而reference中存储的直接就是对象地址。

    这两种对象访问方式各有优势,使用句柄来访问的最大好处就是reference中存储的是稳定的句柄地址,在对象被移动(垃圾回收移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不会被修改。

    使用直接指针访问方式的好处就速度更快,节省了一次指针定位的时间开销,由于对象的访问在Java中非常频繁,因此这类开销积少成多后也是一项非常可观的执行成本,比如HotSpot虚拟机就是使用这种方式进行对象访问的,但从整个软件开发范围看,各种语言和框架使用句柄来访问对象的情况也是非常常见的。

     

    展开全文
  • java对象访问定位

    2019-05-06 12:00:31
    由于reference类型在java虚拟机规范中只规定一个指向对象的引用,并没有定义 这个对象引用应该通过哪种方式去定位访问堆中对象的具体位置。所以对象访问也是取决于虚拟机实现而定。目前有以下两种方式: 使用...
  • JAVA的对象访问定位

    2020-10-23 23:41:35
    并没有规定通过该引用怎么定位访问堆中的对象。具体需要看虚拟机的实现。 两种访问方式: 句柄访问 直接访问 句柄访问 Java堆中会划分一个句柄池,reference存储的就是对象的句柄地址,而句柄中存放的是对象的实例...
  • 简介:Java程序员不可不知的对象访问定位⽅式 当我们在堆上创建⼀个对象实例后,就要通过虚拟机栈中的reference类型数据来操作堆上的对象。现在主流的访问⽅式有两种(HotSpot虚拟机采⽤的是第⼆种): 使⽤句柄...
  • 对象内存布局 对象头 Mark Word (用与存储对象自身运行时的数据) Mark Word的存储内容 类型指针(指向类元数据,拓展:在java7中类元数据存储在方法区('永久代'),java8以元数据区代替) ...
  • 对象访问定位 记录下来方便个人学习复习 注:根据new的参数在常量池中定位一个类的符号引用 --这句话的意思是:常量池相当于c语言中的指针地址集合,所以就是在常量池中保存new对象的地址,通过地址...
  • 目录记录下来方便个人学习复习注:根据new的参数在常量池中定位一个类的符号引用 --这句话的意思是:常量池相当于c语言中的指针地址集合,所以就是在常量池中保存new对象的地址,通过地址定位对象在堆中的位置给对象...
  • Java对象访问定位方式

    2019-05-14 10:31:50
    句柄池、直接指针(访问速度更快)
  • JVM----对象访问定位

    2020-11-25 21:24:07
    访问堆中的对象的具体地址,所以对象访问方式也是取决于虚拟机实现而定的。目前主流的访问方式有使用句柄和直接指针两种。 一、使用句柄访问 若是使用句柄访问方法的话,那么在堆内存中就会划分.
  • 对象访问定位的两种方式

    千次阅读 2019-04-17 21:51:35
    对象访问定位的两种方式(句柄和直接指针两种方式) 3.2 对象的内存布局 在 Hotspot 虚拟机中,对象在内存中的布局可以分为3块区域:对象头、实例数据和对齐填充。 Hotspot虚拟机的对象头包括两部分信息,第一...
  • 条new指令,首先去检查这个指令的参数能否在Metaspar e的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。( 即判断类元信息是否存在)。如果没有,那么在双亲委派模式下...
  • 大多数文章中都会列举如下两张图的内容但是解析不够详细在这里详细解释一下两张图的含义基于句柄的内存定位方式基于指针的内存定位方式java栈是针对每一个线程的,每一个线程都会有自己的栈,维护在其内部的引用就是...
  • 本文详细介绍了HotSpot虚拟机中的对象的内存布局,接着介绍了压缩指针的知识,然后介绍了如何使用jol来查看和计算对象内存使用情况,最后介绍了对象访问定位方式!
  • 1.对象的内存布局 对象的内存布局主要包括:对象头(Header)、实例数据(InstanceData)和对齐填充(Padding)。 1.1对象头(Header) 对象头包括:MarkWord和 和类型指针。 MarkWord是对象自身运行时候的对象...
  • 1.使用句柄访问对象。即reference中存储的是对象句柄的地址,而句柄中包含了对象实例数据与类型数据的具体地址信息,相当于二级指针。 2.直接指针访问对象。即reference中存储的就是对象地址,相当于一级指针。 对比...
  • 在HotSpot虚拟机中,对象在内存区域(java堆中)可分为三块区域----: 1 Header(对象头),包括两部分,第一部分用来存储自身的运行时数据,如hashcode、GC年龄分代。。。; 第二部分是类型指针,指向自己的元...
  • 1.通过句柄访问对象 句柄: 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。 优点:...
  • 第 9 章 对象的实例化内存布局与访问定位 1、对象的实例化 大厂面试题 美团: 对象在JVM中是怎么存储的? 对象头信息里面有哪些东西? 蚂蚁金服: 二面:java对象头里有什么 对象实例化 1.1、对象创建的...
  • 1.通过句柄方式访问,  在Java堆中分出一块内存进行存储句柄池,这样的话,在栈中存储的是句柄的地址 优点:  当对象移动的时候(垃圾回收的时候移动很普遍),... Java栈直接与对象进行访问,在Java堆中对...
  • 在java虚拟机中的对象访问定位主要有两种方式:使用句柄和直接指针两种方式。 1.使用句柄访问时java堆将会划分出一块内存来作为句柄池,reference存储的就是句柄的地址。如下图所示: 2.使用直接指针: ...
  • 访问定位:2种 句柄访问和直接指针 句柄访问:在堆中划出内存作为句柄池,引用类型中存储的就是对象的句柄地址,句柄中包含了对象实例数据和类型数据各自具体的地址信息。好处是引用类型存储的地址是稳定的,对象...
  • 对象访问定位 通过栈上的reference数据来操作堆的具体对象。 1) 句柄: Java堆中划分一块内存作为句柄池,refenrence中存储的对象的句柄地址;而句柄中包含了对象 实例数据(堆中) 与 类型数据(方法区...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,024
精华内容 1,209
关键字:

对象访问定位