当前位置: 首页 > news >正文

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
http://www.jsqmd.com/news/263902/

相关文章:

  • 强烈安利9个AI论文写作软件,本科生论文无忧!
  • 冥想第一千七百六十七天(1767)
  • 缓存 --- Redis缓存的一致性
  • Gemini认证失败?一文搞定所有疑难
  • 7. 为什么云厂商集体选择 vLLM
  • CF1781F Bracket Insertion
  • 8. vLLM vs TensorRT-LLM
  • 如何配置Dev-C++使用特定的编译器版本?
  • 深入解析:浏览器底层探秘:Chrome的奇妙世界
  • 如何在Dev-C++中设置编译器参数?
  • 4. 为什么 Triton 不够了
  • day143—递归—对称二叉树(LeetCode-101)
  • 5. vLLM 出现前的推理地狱
  • MCC音频剪辑工具v1.1.0.0:自动处理配音气口间隙 - 教程
  • 6. PagedAttention 的历史背景
  • 数据湖与数据仓库的演进与未来:一场技术辩论
  • RNR-Map:为视觉导航构建“可渲染”的新型视觉导航地图 - MKT
  • 全网最全MBA开题报告TOP8一键生成论文工具测评
  • 2. 训练 vs 推理:真正烧钱的是哪一步
  • win10 电脑 蓝牙耳机连接后没有声音
  • 为什么大厂都在做智能运维AI平台?AI应用架构师解析背后的商业逻辑
  • 3. OpenAI / DeepSeek 推理系统演进史
  • 为什么所有主流LLM都使用SwiGLU?
  • 模拟南宁理工学院官网页面
  • 2026年长沙婚纱礼服推荐租赁排名:年初备婚请看 - charlieruizvin
  • 兰亭妙微洞察:B 端与 C 端界面设计核心差异,别再用 C 端思维做 B 端
  • 兰亭妙微:以交互设计与UI设计赋能文旅小程序,重塑用户体验界面设计优化新标杆
  • 计算机毕设怎么写?从选题到答辩的超详细通关攻略
  • Linux软件安装 —— JDK安装
  • HTML标签的使用 - 标题和段落