深入理解java虚拟机---对象的访问定位(十)
引用其他人的文章: https://www.cnblogs.com/YYfish/p/6722258.html
那是怎么访问对象呢?
java 程序是通过栈上的reference数据来操作堆上的具体对象的。
首先我们回顾一下虚拟机栈:
虚拟机栈是 java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
局部变量表存放了编译期可知的各种基本数据类型(long,boolean,int,byte,short,long,double,float)、returnAddress类型(指向了一条字节码指令的地址)和
对象引用(reference类型,它不代表对象本身,可能是一个指向对象起始地址的引用指针,也可能指向一个对象代表的句柄或其他与此对象相关的位置)
没错,就是通过 栈帧中局部变量表所存储的对象引用 来对 堆内存中的对象实例进行访问或操作的!
简单点理解就是 栈帧中有个对象引用的指针, 通过各种方法指向了堆内存中的对象实例。
而这各种方法中,主流的有2种:
1.句柄
java堆中划分出一块内存作为句柄池,reference中存储的是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。如图2-2:
2.直接访问对象
reference直接指向了对象类型数据,那么java堆对象分布中就必须考虑如何放置访问类型数据的相关信息,
reference存储的直接就时对象地址。如图:2-3
这两种对象的访问方式各有优势,使用句柄访问最大的好处就是reference中存储的是稳定的句柄地址,在对象被移动时,只用修改句柄中的实例数据指针,而reference本身不需要修改!
而直接访问对象方式的好处就是,减少一次指针定位的时间开销,由于对象的访问是非常频繁的,因此这类开销积少成多也是一项非常的执行成本。
深入理解java虚拟机---对象的访问定位(十)的更多相关文章
- 深入理解java虚拟机---对象的结构(九)
注意: 我们可以看到的就是InstanceData的数据. 先转载一篇文章作为开头,因为讲的非常详细,我就简单加工下放到这里: 对象结构 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区 ...
- 深入理解java虚拟机---对象的创建过程(八)
1.对象的创建过程 由于类的加载是一个很复杂的过程,所以这里暂时略过,后面会详细讲解,默认为是已加载过的类.着重强调对象的创建过程. 注意: 最后一步的init方法是代码块和构造方法. 以上是总图,下 ...
- Java虚拟机-对象的创建和访问
一.对象的创建: 创建对象在java上面是很简单的,使用new关键字就可以了,但是其实在虚拟机中,java对象的创建是一个复杂的过程. 当java虚拟机遇到一个new的指令的时候,对象创建的程序正式启 ...
- Java内存区域与内存溢出异常---对象的内存布局和对象的访问定位
对象的内存布局 在HotSpot虚拟机中,对象在内存中的存储布局可以划分为三个区域:对象头,实例数据,对齐填充. 对象头包括两部分信息:第一部分用于存储对象自身的运行时数据,如哈希码,GC分代 ...
- 《深入理解java虚拟机》笔记(2)HotSpot虚拟机对象探秘
一.对象的创建 1.类加载: 虚拟机在遇到一条new指令时候,检查类是否已被加载.解析.初始化过,如果没有,则执行类加载过程. 2.分配内存:类加载完成后,则为新对象从java堆上分配内存,分配内存有 ...
- Java对象的内存布局以及对象的访问定位
一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储 ...
- 3 Java对象的内存布局以及对象的访问定位
先来看看Java对象在内存中的布局 一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机 ...
- (四)java对象的结构和对象的访问定位
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 一. 对象头 HotSpot虚拟机的对象 ...
- 深入理解Java虚拟机-HotSpot虚拟机对象探秘
一.对象的创建过程 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那就先执行相应的类 ...
随机推荐
- Android SDK无法更新的解决方法
一.说明: Android 更新sdk时访问google很慢,有时连接不上,可利用国内的某些镜像网站实现Android SDK在线更新. 二.解决方法: 在SDK Manager -> tool ...
- learn python the hard way 习题1~5总结
习题1 print 语句print('Yay! Printing.')print('I "said" do not touch this') 习题2:注释和 # 号 #(octot ...
- ASP.NET发送电子邮件(转)
原始地址:http://www.cnblogs.com/ForEvErNoME/archive/2012/06/05/2529259.html(有代码下载,博主真是有操守) 1.补充知识 (1)POP ...
- ImportError: sys.meta_path is None, Python is likely shutting down
python执行过错中,报错:ImportError: sys.meta_path is None, Python is likely shutting down 解决方法:在C:\Users\Adm ...
- 串的模式匹配算法 ------ KMP算法
//KMP串的模式匹配算法 #include <stdio.h> #include <stdlib.h> #include <string.h> int* get_ ...
- 牛客寒假算法基础集训营6 E 海啸
题目链接点这里 这个题输入类型是第一次见,并没有把n和m的具体范围给你,但是给了n*m的范围,武断的设为1e6*1e6的二维数组铁铁WA,就将二维数组转换为一维数组 题目类型属于二维数组前缀和,有um ...
- 子类父类(虚函数下的 引用指针 对象)->看来没有子类指针这回事
#include<iostream> using namespace std; class Father { public: Father() { cout << " ...
- python-mongodb基本操作都在这了
数据库 增 use db1 #有则切换,无则新增 查 show dbs #查看所有 db #当前 删 db.dropDatabase() 集合: 增: db.user db.user.info db. ...
- MYSQL的C API之mysql_query
1.首先使用MYSQL conn 连接数据库 2.设置数据库编码 3.int res = mysql_query(&conn,"SQL语句"); if(!res)表示成功 ...
- poj2117-tarjin求割点
http://poj.org/problem?id=2117 求移除一个点以及与它相邻边后,剩下的图中最大的联通子图的数量是多少. 跑一遍tarjin统计下拆除某个点剩下的子图数量即可.注意给出的图不 ...