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:简…

python阴阳师_如何用Python找到阴阳师妖怪屋的最佳探索队伍!强不强?

程序由来最初想要写这个小程序是因为,9月份那段时间我在玩妖怪屋。因为刚开始抽卡,要啥啥没有,所以探索队伍也只是放了几个自己记得有关联的式神。在网上有找到完整版的羁绊,但是怎么根据羁绊找到最佳的式神组合就成问题了。当时我…

Android iOS防录屏截屏

目录Android防录屏和截屏关于WindowManager.LayoutParams.FLAG_SECURE关于Display.FLAG_SECUREiOS防录屏和截屏监听截屏录屏监听需求与安全总是对立的,有新的需求,就有新的接口开放,但随之而来的就是利用新接口或者新接口的使用者&#xff08…

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

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

Android adb 启动APP

目录启动命令一 常规命令 包名/activity二 常规命令 包名命令关闭App获取包名和activity的路径代码获取1 命令获取( 需要app运行在前台,停留在启动界面)2命令获取(先执行命令,再点击app启动)启动命令 一 常规命令 包名/activity adb shell am start…

python语言使用什么语句实现上下文管理协议_Python 上下文管理器

上下文管理器在使用Python编程中,可以会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作;当语句块执行完成后,需要继续执行一些收尾动作。例如:当需要操作文件或数据库的…

Android日志[基础篇]Android Log日志输出

Android日志[基础篇]二 Android Studio修改LogCat日志的颜色 android.util.Log输出日志的常用方法如下: Log.v(String tag, String msg)Log.d(String tag, String msg)Log.i(String tag, String msg)Log.w(String tag, String msg)Log.e(String tag, String msg) …

python函数应用_python 函数应用

#函数的参数就是个变量#定义函数的时候,使用关键字参数,可以指定默认值def hello(namereboot,age1):return hello %s,your age is %s %(name,age)print hello(reboot,3)print hello(3,reboot)#print hello(age3,namereboot)print hello(reboot)def f(n):…

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函数,让你喜欢上它!有兴趣的小伙伴可以持续关注我,或者在专栏进行查看学习,愿与…

Android JNI Attempt to remove non-JNI local reference, dumping thread

Attempt to remove non-JNI local reference, dumping thread 解决办法: 去除Jni代码 env->DeleteLocalRef(javaObject);注意:是java层传递给jni层的对象不需用了DeleteLocalRef来进行对象删除,jni层创建的对象仍然需要保留代码。 这个…

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

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

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面试基础二-原理及常见问题 目录1、四大组件1)Activity2)Service3)ContentProvider4)Broadcast Receiver2、四大组件的生命周期和简单用法1)Activity2)Service3)BroadcastReceiver4&…

python怎么用大数据分析师_如何七周成为数据分析师18:Python的新手教程

本文是《怎样七周成为数据剖析师》的第十八篇教程,假定想要了解写作初衷,能够先行阅读七周指南。温馨提示:假定您曾经熟习Python,大可不用再看这篇文章,或只选择部分。Python是近年来最火爆的言语,曾经作为…

Android面试基础二-原理及常见问题

Android 面试基础一 目录Android源码相关分析1、Android属性动画实现原理2、补间动画实现原理3、Android各个版本API的区别4、Requestlayout,onlayout,onDraw,DrawChild区别与联系5、invalidate和postInvalidate的区别及使用6、Activity-Wind…

python数据展示库_收藏!盘点很实用的数据科学Python库

数据科学是一门研究数据并从中挖掘信息的学科。它不要求自创或学习新的算法,只需要知道怎么样研究数据并解决问题。这一过程的关键点之一就在于使用合适的库。本文概述了数据科学中常用的、并且有一定重要性的库。在进入正题之前,本文先介绍了解决数据科…