黑马JVM总结(二十五)

(1)字节码指令-cinit

构造方法可以分为两类,一类是cinit 一类init 

cinit是整个类的构造方法

putstatic:进行static变量的赋值,是到常量池里找到名字一个叫做i的变量 

(2)字节码指令-init

init是:每个构造对象的构造方法 

对成员变量的赋值,初始化代码块,构造方法里面的代码,最终呢也也会收集成同一个方法,会把这些代码最终呢合并在一起

以上呢就是对整个构造方法,关联到成员变量赋值操作,初始化代码块以后的执行的流程

(3)方法的调用

我们来看看不同的方法他们调用的字节码指令是否一样  

如果是构造方法调用的是invokespecial  私有也是调用 invokespecial   final也是调用的invokespecial   普通的public调用的invokevirtual  两次静态方法调用的invokestatic

public的方法是不能唯一确定的,它可能出现方法重写的情况,因此在编译期间他不能唯一确定它调用的是那个方法,也许是子类的也许是父类的invokevirtual 所以称之为动态绑定,需要在运行的时候确定

在性能上invokespecial  和invokestatic性能更高一些因为他属于静态绑定,将来就能找到方法的执行地址了,invokevirtual需要确定多次才能确定方法的执行地址这是这几个方法调用的指令  

pop是静态方法的调用是不需要对象的pop把对象出栈

(4)多态原理-HSDB

invokevirtual是显现方法的多态调用,它的工作方式相对较为复杂,下面研究一下执行流程 

使用虚拟机工具可以看到我们虚拟机中比较底层的内存状态和内存地址 

(5)多态原理-查找类

查询Dog这个对象:查询出对象在内存中的地址

这个对象呢分了对象头,成员变量,这里质包含了对象头16个字节:前8个字节mark1:包含对象的哈希吗以及后来加锁时的锁标记,后面8个字节是对象的类型指针,根据对象的类型指针可以找到Class类

 可以查看这俩内存的实际地址:

对象类型 指针的类型表示:Dog在java虚拟机里的样子,它是处在方法区包含了这个类的所有信息

常量池的指针地址,方法入口的指针地址

(6)多态原理-vtable

下面我们来看类中的方法指那种多态的方法它是存在一种交vtable的虚方法表中,前面提到的静态方法,final方法,私有方法,他们不会列在这个虚方法表中,他在类的结构的中的最后一个

vtable的地址是:028换成1E0

         

在对象头里可以看到vtable的长度:

虚方法表中最后一个方法的地址就是对应Dog类的eat方法

虚方法表中第三项实际调用父类Animal中的toString方法

 

Object类:

我们对对象的虚方法表做了一个分析,以后呢通过对象找到Class类,通过Class类知道虚方法表后,我们可以确定每个方法的实际入口地址发现有的来自父类,有的是本类,将来我们就知道一个对象调用方法时到底找的是那个方法,虚方法表是在类的加载过程中的连接阶段就会生成虚方法表,在链接的时候确定了每一个方法的入口地址

(7)多态原理-总结

这个是多态调用时方法的查找过程,这个过程还是比较复杂的,需要查找很多步,从细微的效率上不如:invokespecial  和invokestatic,因为它设计到运行期间动态的对它进行查找,当然JVM也会对这个查找做一个进一步优化,有一个缓存,当反复的调用同一个方法达到次数以后,就会从缓存中找到这个方法的字节码地址,就不用经历这么多的查找步骤了 

多态在运行期间虚拟机可以做一个单态的优化,也可以加快方法的取值速度

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

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

相关文章

Waves 14混音特效插件合集mac/win

Waves14是一款音频处理软件,主要用于音频编辑、混音和母带处理。该软件提供了各种插件,包括EQ、压缩、混响、延迟、失真等,以及一些专业的音频处理工具,如L2限幅器、Linear Phase EQ和多频道扬声器管理。 Mac软件下载:…

信创之国产浪潮电脑+统信UOS操作系统体验2:安装visual studio code和cmake搭建C++开发环镜

一、引言 在linux以及unix下开发C程序很多人都做过,笔者以前是通过vi编辑器编辑或者在windows下编辑甚至编译再将源文件ftp保存到服务器上,再在服务器端使用gcc编译,用gdb调试,但现在使用的国产电脑,客户端就是linux&…

迄今为止丨ChatGPT最强指令,一个可以让机器人生成机器人的Prompt,价值百万!

原文: 【ChatGPT调教】ChatGPT最强指令、让机器人为你生成机器人!-CSDN博客 说明:最好看原文 昨天,发现了一条可能是迄今为止,我见过最牛的,商业价值最高的ChatGPT指令。 通过这条指令,可以…

正点原子嵌入式linux驱动开发——U-boot启动流程详解

在上一篇笔记中详细分析了uboot的顶层Makefile,理清了uboot的编译流程。本章来详细的分析一下uboot的启动流程,理清uboot是如何启动的。通过对uboot启动流程的梳理,可以掌握一些外设是在哪里被初始化的,这样当需要修改这些外设驱动…

【搭建私人图床】使用LightPicture开源搭建图片管理系统并远程访问

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进,功能也越来越多,而手机…

Linux程序崩溃时的信号量(signal)说明

一、概念说明 在程序崩溃的时候,我们将会获取到两个信息: • signal: 信号量,下文将会详细的说明不同的信号量及其含义 • code: 错误码, 除了几个所有信号量(signal) 公共的错误码(code),一般不同信号量(signal)有特定的错误码(code)&#x…

oracle OCP OCM MySQL OCP认证难吗?

好多人在初次考OCP时,不知道如何选择,本文让姚远ACE老师为大家总结一下吧! 选择OCP认证时要注意的问题: 1,授课老师师资经验(非常重要) 2,课程大纲 3,试听课程 4&am…

7.wifi开发【智能家居:终】,实践总结:智能开关,智能采集温湿,智能灯。项目运行步骤与运行细节,技术归纳与提炼,项目扩展

一。项目运行步骤与运行细节 1.项目运行步骤(一定有其他的运行方式,我这里只提供一种我现在使用的编译方式) (1)项目运行使用软件与技术: 1.Virtual linux 使用这个虚拟机进行程序的编译 2.Makefile与shl…

10.4| QT实现TCP服务器客户端搭建的代码,现象

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>#include<QTcpServer> //服务器头文件 #include<QTcpSocket> //客户端头文件#include<QList> //链表容器 #include<QMessageBox> …

10.3 C++运算符重载实现的过程,代码

目录 运算符重载背景&#xff08;operator&#xff09; 定义 重载的方法 不能重载的运算符 运算符重载注意事项 代码实现 运行结果 运算符重载背景&#xff08;operator&#xff09; 自定义的类中&#xff0c;系统默认只提供两个运算符供用户使用&#xff0c;分别是赋值…

spark on hive

需要提前搭建好hive&#xff0c;并对hive进行配置。 1、将hive的配置文件添加到spark的目录下 cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf2、开启hive的hivemetastore服务 提前创建好启动日志存放路径 mkdir $HIVE_HOME/logStart nohup /usr/local/lib/apache-hi…

合并不同年度收入数据-外连接

案例需求&#xff1a;统计2019年和2020年的客户销售收入并求和 思路&#xff1a;使用pandas读取excel数据横向连接&#xff0c;使用sum()含函数求和 代码如下&#xff1a; 1、使用pandas读取excel数据 2、由于两个表一个是"客户名称"&#xff0c;一个是客户描述,使…