vc 通过句柄修改窗口大小_漫画:对象是如何被找到的?句柄 OR 直接指针?

4a83e6fb3d421d1de70e1dea112b3850.png

0377184acfab651480ba9a7ebb0fd174.png

c8c004bcddc762f1781cc31af4668525.png

10cfa74a9db0349aa4bf2b93c68ffea3.png

3fe7debc740cda5bbd157563d00c97fe.png

5e03b8ea8d9a1fcf8cd900891eab1480.png

052af5d1d6cd5ba3d02b9644f8d032bd.png

caaa299a3003682bce940d00e66e3416.png

adf96ed41f26c98211fedd751a1fd32a.png

c30790759b722c18d2879e75ea11c180.png

7507b3effee82ad750489d4dfce13d71.png

ff28c600952e18c77ab71d5781169162.png

6e91165c66fb349fc074a25f056562f3.png

897586e0c19a300b90d96e8f8b7506a8.png

de97cdcda773db06610096504546a109.png

ad60da8e97173e6d8595d07694088468.png

5a3427bd13e8cba58c035f0a4639c8ed.png

9e777f8788e9817be360719bf3e7327c.png
小贴士:想要使用并定位 Java 对象,就要用到 Java 虚拟机栈(Java Virtual Machine Stack),它描述的是 Java 方法执行的线程内存模型:每个方法被执行的时候,Java 虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

代码解读

以下面代码为例,来说明对象定位的过程:

class Bus extends Car {private String code;private String color;Bus(String code, String color) {this.code = code;this.color = color;}// 省略其他方法...
}
public class ReferenceTest {Bus myBus = new Bus("Java中文社群", "蓝色");
}

以官方默认的 HotSpot 虚拟机来说, myBus 就是存储在本地变量表中 reference 类型的变量, new Bus("Java中文社群", "蓝色") 就是存储在 Java 堆中的对象实例数据,它存储了此实体类的所有字段信息,例如 code="Java中文社群" 以及 color="蓝色" 等信息,而 Java 堆中的还存储着对象类型数据的地址,它存储的是对象的类型信息,还有它的父类信息等。

总结

由于 reference 类型在《Java虚拟机规范》里面只规定了它是一个指向对象的引用,并没有定义这个引用应该通过什么方式去定位、访问到堆中对象的具体位置,所以对象访问方式也是由虚拟机实现而定的,主流的访问方式主要有使用句柄和直接指针两种:

  • 如果使用句柄访问的话,Java 堆中将可能会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自具体的地址信息;
  • 如果使用直接指针访问的话,Java 堆中对象的内存布局就必须考虑如何放置访问类型数据的相关信息,reference 中存储的直接就是对象地址,如果只是访问对象本身的话,就不需要多一次间接访问的开销。

因此使用句柄来访问的最大好处就是 reference 中存储的是稳定句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而 reference 本身不需要被修改。使用直接指针访问速度更快,但如果对象被移动则需要修改 reference 本身。

由于对象访问在 Java 中非常频繁,因此这类开销积少成多也是一项极为可观的执行成本,所以官方默认的 HotSpot 虚拟机采用的就是「直接指针」来定位对象的。

参考 & 鸣谢

周志明《深入理解Java虚拟机》第 3 版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构快速掌握和温习-面试神器

由于原文有部分文字没有显示,本文有所修改。主要包括文字和缩进。 目录 Q1:数据结构和算法的知识点整理: Q2:链表,队列和栈的区别 Q3:简述快速排序过程 Q4:快速排序算法的原理 Q5:简…

work节点使用外部包_AFLSmart工具简单分析及使用介绍

AFLSmart 是一个在 AFL 基础上,结合了 Peach 的结构化输入组件的灰盒 smart fuzz 工具。AFLSmart 链接:https://github.com/aflsmart/aflsmart参考资料:《Smart Greybox Fuzzing》什么是 AFLSmart灰盒 smart fuzz灰盒测试是基于程序运行时刻的…

Android日志[基础篇]二 Android Studio修改LogCat日志的颜色

上一篇提到Android日志的5个级别的日志输出,在logcat里面设置自己喜欢或习惯的颜色,本文不只讲Android Sudio修改logcat的日志颜色。 代码和效果 代码 private void logColor(){Log.v(TAG,"logColor verbose");Log.d(TAG,"logColor de…

readfile函数使用方法_1分钟学会LOOKUP函数,有网友说使用这个方法,初学者秒变大神...

Hi,大家好,本专栏将会从零开始和大家用图文的方式,30天让你从不会到熟练使用函数,0基础开始学习Excel函数,让你喜欢上它!有兴趣的小伙伴可以持续关注我,或者在专栏进行查看学习,愿与…

背景图层和普通图层的区别_图层样式(一)—高级混合选项

一、图层顺序为了便于说明,首先建立例子,新建图层,用画笔随便画个圈,新建蒙版随便画一笔,然后把所有图层样式加给它。可以看到样式从上到下的顺序,这也是它们混合的图层顺序。图层顺序我的效果,…

Android9.0 http网络请求失败问题的处理

目录处理方法(任意一种):APP改用https请求targetSdkVersion 降到27以下配置network-security-config(推荐)原因出错案例处理方法(任意一种): APP改用https请求 这种方式是最佳方法,需要前后端协调,后端得…

代码里无图片地址_项目实战:爬高清图片

↑ 关注 星标 ,后台回复【大礼包】送你2TPython自学资料好消息:Python学习交流群,已经建立,猛戳加入之前我发过一些爬虫的文章,不过一直没发过爬取图片的,今天就给大家分享一篇吧!/1 前言/上篇…

Android TextView通过SpannableString设置字体、大小、颜色、样式、超级链接

代码应该都能看明白 public class MainActivity extends ActionBarActivity {private TextView tv, tv2;private SpannableString sStr, sStr2;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.act…

winform项目_winform项目——仿QQ即时通讯程序01:原理及项目分析

即时通讯程序,腾讯QQ可以说是一家独大,虽然市场上仍然有类似QQ的即时通讯程序,但是基本上面向的对象都是特定人群。那么,现在做一个即时通讯的软件还有意义吗?在我看来,意义非常大。作为一个学习编程的人&a…

Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈)

Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Android日志[进阶篇]四-获取错误报告 Android日志[进阶篇]五-阅读错误报告 目录调试中的堆栈轨迹从外部来源打开堆栈轨迹监控剪…

Android日志[进阶篇]一-使用 Logcat 写入和查看日志

Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Android日志[进阶篇]四-获取错误报告 Android日志[进阶篇]五-阅读错误报告 目录查看应用日志写入日志消息Logcat 消息格式设置…

哈希表数据结构_算法与数据结构-哈希表

前面我们已经讲到了数组和链表,数组能通过下标 O(1) 访问,但是删除一个中间元素却要移动其他元素,时间 O(n)。 循环双端链表倒是可以在知道一个节点的情况下迅速删除它,但是吧查找又成了 O(n)。难道就没有一种方法可以快速定位和删…

Android日志[进阶篇]四-获取错误报告

Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Android日志[进阶篇]四-获取错误报告 Android日志[进阶篇]五-阅读错误报告 目录前言从设备上获取错误报告从 Android 模拟器上…

下列哪个适合做链栈_朋友圈人格图鉴:三天可见 vs 全部可见,哪个更适合做恋人?...

你们的朋友圈里有没有这样几种人&#xff1f;<< 朋友圈大赏 >>你可能已经对这些朋友圈的风格习以为常&#xff0c;其实&#xff0c;每个人在朋友圈展示的语言、行为&#xff0c;可能默默揭示着一个人自己原本是怎样的人、想成为什么样的人&#xff0c;以及与他人的…

iatf16949内审员_申请IATF16949认证有什么要求

1、证件要求必须要提供三证合一的营业执照&#xff08;在有效期内&#xff09;&#xff0c;营业执照的范围必须与申请IATF16949认证范围一致。2、处于汽车供应链的证明因为IATF16949认证要求厂家必须是直接与生产汽车有关的&#xff0c;具有加工制造能力&#xff0c;并通过这种…

GenseeSDK DocView(OpenGL)引起的TextView显示黑块

现象 先上图&#xff1a; 正常的图&#xff1a; 来到这的大侠是否也出现了同样的问题。 操作与描述 退出直播播放器后&#xff0c;整个app界面所有的TextView(EditText/Button)都显示为黑块。 快速解决 退出直播或点播后不要调用DocView的closeDoc函数即可&#xff0c;当…

Android WebView https白屏、Http和Https混合问题、证书配置和使用

目录前言启用https后白屏&#xff08;证书错误&#xff09;修改处理WebView中Http和Https混合问题处理办法Webview的几种内容加载模式证书配置或处理https请求的证书okhttp进行请求&#xff1a;HttpsURLConnection忽略证书前言 原有项目中有部分界面是用webview展现的h5页面&am…

tensorrt轻松部署高性能dnn推理_基于TensorRT车辆实时推理优化

基于TensorRT车辆实时推理优化Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Autonomous Vehicles自动驾驶系统使用各种神经网络模型&#xff0c;这些模型要求在GPU上进行极其精确和高效的计算。Zoox是一家全新开发robotaxis的初创公司&#xff0c;充分利…

手机上网流量统计_数据统计 | 上半年手机流量同比增110.2%,你贡献了多少?

来源&#xff1a;工信部网站、中新经纬版权申明&#xff1a;内容来源网络&#xff0c;版权归原创者所有。除非无法确认&#xff0c;我们都会标明作者及出处&#xff0c;如有侵权烦请告知我们&#xff0c;我们会立即删除并表示歉意。谢谢&#xff01;7月25日&#xff0c;工信部网…

mybatis insert插入成功返回0_mybatis添加客户

在MyBatis的映射文件中&#xff0c;添加操作是通过元素来实现的。例如&#xff0c;向数据库中的t_customer表中插入一条数据可以通过如下配置来实现。在上述配置代码中&#xff0c;传入的参数是一个Customer类型&#xff0c;该类型的参数对象被传递到语句中时&#xff0c;#{use…