news 2026/4/22 20:01:20

hotspot中的Java类对象如何保存虚函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
hotspot中的Java类对象如何保存虚函数
hotspot中的Java类对象如何保存虚函数
  • 定义

在Java中,几乎所有可被继承的函数被称为虚函数。

In HotSpot, a virtual method is essentially: Any non-static, non-private, non-final instance method whose invocation target is determined at runtime based on the actual class of the object.

还是以Dog类为例

public class Dog implements Animal { ... public String speak(){ return "Woof!"; } ... }

这里的speak()函数就是Java的虚函数,编译后的字节码文件也使用invokevirual字节码来执行该函数

27: invokevirtual #53 // Method speak:()Ljava/lang/String;

在《Java虚拟机规范》上对invokevirtual的解释如下

Invoke instance method; dispatch based on class
  • Klass中虚函数字段

在hotspot中使用Klass的虚函数使用vtable()来描述

class Klass : public Metadata { ... protected: // vtable length int _vtable_len; // vtables klassVtable vtable() const;//返回KlassVtable对象 ... }

在hotspot解析字节码的函数部分中会筛选出虚函数部分

#0 klassVtable::compute_vtable_size_and_num_mirandas ( #1 0x00007ffff61b1927 in ClassFileParser::post_process_parsed_stream ( #2 0x00007ffff61afcf0 in ClassFileParser::ClassFileParser (

void klassVtable::compute_vtable_size_and_num_mirandas函数中根据函数的访问权限找出虚函数

void klassVtable::compute_vtable_size_and_num_mirandas( ... if (needs_new_vtable_entry(method, super, classloader, classname, class_flags, major_version)) {//判断的昂前函数是否为虚函数 ... vtable_length += vtableEntry::size(); // we need a new entry } ... }

我们现在针对java/lang/Object进行gdb调试,我们来看看needs_new_vtable_entry函数中可以引发vtablemethod

Thread 2 "java" hit Breakpoint 4, klassVtable::compute_vtable_size_and_num_mirandas (vtable_length_ret=0x7ffff59fdf28, num_new_mirandas=0x7ffff59fdf30, all_mirandas=0x7ffff0034af0, super=0x0, methods=0x7fffe8800460, class_flags=..., major_version=61, classloader=..., classname=0x7ffff40210f0, local_interfaces=0x7fffe8800058) at /home/jx/src
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 19:59:29

如何配置Dev-C++使用特定的编译器版本?

在 Dev-C 中配置特定编译器版本需要手动操作,以下是详细步骤:1. 安装目标编译器版本下载所需版本的编译器(如 MinGW 的特定 GCC 版本)解压至独立目录(例如:D:\MinGW-13.1)2. 配置 Dev-C打开工具…

作者头像 李华
网站建设 2026/4/22 19:58:15

为什么大厂都在做智能运维AI平台?AI应用架构师解析背后的商业逻辑

为什么大厂都在做智能运维AI平台?AI应用架构师解析背后的商业逻辑 引言:一场运维故障引发的思考 2023年双11凌晨,某头部电商平台的支付系统突然宕机12分钟。尽管技术团队紧急修复,但这场故障仍导致: 直接交易损失超2亿…

作者头像 李华
网站建设 2026/4/22 19:58:17

YOLO26 改进 - 注意力机制 | 空间增强注意力SEAM(Spatially Enhanced Attention Module)提升遮挡场景检测鲁棒性

前言 本文介绍了分离与增强注意力模块(SEAM)在YOLO26中的结合应用。SEAM模块旨在增强面部特征学习能力,特别是处理面部遮挡问题。它采用多头注意力机制强调面部区域、抑制背景区域,第一部分使用深度可分离卷积减少参数并学习通道…

作者头像 李华
网站建设 2026/4/22 20:01:01

YOLO26 接入实时视频 - GPU 加速

1. GPU 加速优化第一版代码直接使用CPU 进行模型识别,速度根据模型大小而明显变慢yolo26n.pt 最小(5.5M),识别最快, 在 50ms左右yolo26s.pt 20.4M, 在75ms左右yolo26m.pt 44.3M, 在120ms左右yolo26l.pt 53.2M,在150ms左右yolo26x.…

作者头像 李华
网站建设 2026/4/20 17:26:33

前端性能优化指南:从加载到交互的每一毫秒

前言 上个月,我们的产品被反馈"页面加载太慢"。用户在3G网络下需要等待8秒才能看到内容。 经过一个月的优化,我们把首屏加载时间从8秒降到了1.2秒。这篇文章分享我们的优化实践。 一、性能指标体系 1.1 核心Web指标(Core Web Vi…

作者头像 李华