吉林市网站建设_网站建设公司_模板建站_seo优化
2026/1/18 20:38:22 网站建设 项目流程
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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询