0

0

Java虚方法表是如何建立的_Java虚拟调用调度机制说明

P粉602998670

P粉602998670

发布时间:2025-12-16 10:05:13

|

625人浏览过

|

来源于php中文网

原创

Java虚方法表(vtable)在类加载的准备和解析阶段静态构建,是一张由JVM为每个类生成的指针数组,存储非private、非static、非final实例方法的实际入口地址,按继承顺序排列并支持重写覆盖,供invokevirtual指令通过编译期确定的索引号实现O(1)多态调用。

java虚方法表是如何建立的_java虚拟调用调度机制说明

Java虚方法表(vtable)是在类加载的准备和解析阶段由JVM自动构建的,不是运行时动态生成,也不依赖对象实例。它的核心作用是支撑 invokevirtual 指令实现多态调用——即在运行时根据对象实际类型,快速定位并跳转到正确的具体方法实现。

虚方法表在类加载时静态构建

JVM在类加载的“准备”和“解析”阶段,为每个类(除接口外)生成一张虚方法表。这张表本质是一个指针数组,每个槽位存储该类某个虚方法(非private、非static、非final的实例方法)的实际入口地址。

  • 表结构按方法声明顺序排列:先继承自父类的方法,再是本类新定义的方法;重写的方法会覆盖父类对应槽位
  • final方法虽是虚方法(可被继承),但因不可重写,其vtable槽位在子类中仍指向原始实现,不会被替换
  • static和private方法不进入vtable——它们在编译期就绑定符号引用,走invokestatic/invokespecial,不参与虚调用
  • 接口方法不使用传统vtable,而是通过itable(接口方法表)+ 接口解析逻辑处理,机制不同

虚调用执行时如何查表

当执行 invokevirtual 指令时,JVM并不遍历继承链,而是直接根据对象的实际类(即heap中对象头里的Klass指针),取出该类的vtable,再用编译期已知的“方法在vtable中的索引号”进行查表跳转。

  • 这个索引号在编译期就确定了,比如String.toString()在Object类vtable中固定占第5号槽位,所有子类vtable的第5号槽都对应各自重写的toString实现
  • 查表过程是O(1)的,无需运行时搜索或匹配方法签名
  • 若调用的是父类未被重写的方法(如Object.hashCode()在未重写的子类中),vtable对应槽位仍指向Object类中的原方法入口

子类vtable如何复用与扩展

子类vtable不是从零构建,而是在父类vtable基础上复制并修正:继承父类所有虚方法槽位,覆盖被重写的方法地址,末尾追加本类新声明的虚方法。

Face Swap Online
Face Swap Online

在线免费换脸,支持图片换脸和视频换脸

下载

立即学习Java免费学习笔记(深入)”;

  • 例如:A有f()、g();B extends A且重写f()、新增h();则B的vtable = [B.f(), A.g(), B.h()],长度比A多1
  • 这种设计让继承关系天然映射到内存布局,保证了多态调用的高效性和一致性
  • 字段不参与vtable——vtable只管方法分发,字段访问走的是对象内存偏移量(由InstanceKlass描述)

注意几个常见误区

vtable机制常被误解为“运行时动态生成”或“每次调用都查找”,其实它高度静态化,关键点在于编译期索引+类加载期建表+运行时查表三者协同。

  • 不是每个对象一份vtable——整个类的所有实例共享同一张vtable(存于方法区)
  • 反射调用、MethodHandle、Lambda等不走vtable主路径,它们走的是解释器或专门的链接逻辑
  • 即时编译器(如C2)可能进一步优化:对单实现的虚调用去虚化(devirtualize),直接内联,绕过vtable

基本上就这些。vtable是JVM实现面向对象多态的底层基石,理解它有助于看清“看似动态”的方法调用背后其实是精心组织的静态结构。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

523

2023.08.02

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

54

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

191

2025.11.08

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

89

2026.02.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.1万人学习

C# 教程
C# 教程

共94课时 | 8.3万人学习

Java 教程
Java 教程

共578课时 | 55.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号