33 根据 InstanceKlass 查找 vtable 的数据
Posted 蓝风9
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了33 根据 InstanceKlass 查找 vtable 的数据相关的知识,希望对你有一定的参考价值。
前言
// 呵呵 下周就要离开这个住了五年的地方了吧
之前(2020.05.17)在 hllvm 群组看到这样一篇文章, 呵呵 当时打了一个 todo, 是时候清理 todo 了
在HSDB中查看instanceKlass中vtable的疑问?
就是给你一个 InstanceKlass, 你怎么定位到 这个 Klass 对应的额 vtable 呢?
本文主要是从两个方向来解释
一个是 vm 调试, 另外一个是 根据 HSDB 来查询
以下调试 vm 部分基于 jdk9, HSDB 部分基于 jdk8
测试用例
package com.hx.test07;
import java.awt.event.ActionListener;
import java.util.AbstractCollection;
/**
* LookUpVTable
*
* @author Jerry.X.He <970655147@qq.com>
* @version 1.0
* @date 2020-06-26 11:09
*/
public abstract class Test02LoopUpVTable extends AbstractCollection<String> implements ActionListener
// identStr
private String identStr = "identStr";
int f01;
int f02;
int f03;
int f04;
int f05;
// Test02LoopUpVTable
public static void main(String[] args)
// Test02LoopUpVTable instance = new Test02LoopUpVTable();
//
// int sz = instance.size();
int sz = 222;
System.out.println(" szie : " + sz);
// @Override
// public String get(int index)
// return null;
//
@Override
public int size()
return 222;
对应的字节码信息如下, 下面参照可能需要使用到
master:test07 jerry$ javap -c -v Test02LoopUpVTable.class
Classfile /Users/jerry/IdeaProjects/HelloWorld/target/classes/com/hx/test07/Test02LoopUpVTable.class
Last modified Jun 26, 2020; size 1171 bytes
MD5 checksum e3b1a319ed8ec01458c1bc5d08937f60
Compiled from "Test02LoopUpVTable.java"
public abstract class com.hx.test07.Test02LoopUpVTable extends java.util.AbstractCollection<java.lang.String> implements java.awt.event.ActionListener
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER, ACC_ABSTRACT
Constant pool:
#1 = Methodref #13.#41 // java/util/AbstractCollection."<init>":()V
#2 = String #15 // identStr
#3 = Fieldref #12.#42 // com/hx/test07/Test02LoopUpVTable.identStr:Ljava/lang/String;
#4 = Fieldref #43.#44 // java/lang/System.out:Ljava/io/PrintStream;
#5 = Class #45 // java/lang/StringBuilder
#6 = Methodref #5.#41 // java/lang/StringBuilder."<init>":()V
#7 = String #46 // szie :
#8 = Methodref #5.#47 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#9 = Methodref #5.#48 // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
#10 = Methodref #5.#49 // java/lang/StringBuilder.toString:()Ljava/lang/String;
#11 = Methodref #50.#51 // java/io/PrintStream.println:(Ljava/lang/String;)V
#12 = Class #52 // com/hx/test07/Test02LoopUpVTable
#13 = Class #53 // java/util/AbstractCollection
#14 = Class #54 // java/awt/event/ActionListener
#15 = Utf8 identStr
#16 = Utf8 Ljava/lang/String;
#17 = Utf8 f01
#18 = Utf8 I
#19 = Utf8 f02
#20 = Utf8 f03
#21 = Utf8 f04
#22 = Utf8 f05
#23 = Utf8 <init>
#24 = Utf8 ()V
#25 = Utf8 Code
#26 = Utf8 LineNumberTable
#27 = Utf8 LocalVariableTable
#28 = Utf8 this
#29 = Utf8 Lcom/hx/test07/Test02LoopUpVTable;
#30 = Utf8 main
#31 = Utf8 ([Ljava/lang/String;)V
#32 = Utf8 args
#33 = Utf8 [Ljava/lang/String;
#34 = Utf8 sz
#35 = Utf8 size
#36 = Utf8 ()I
#37 = Utf8 Signature
#38 = Utf8 Ljava/util/AbstractCollection<Ljava/lang/String;>;Ljava/awt/event/ActionListener;
#39 = Utf8 SourceFile
#40 = Utf8 Test02LoopUpVTable.java
#41 = NameAndType #23:#24 // "<init>":()V
#42 = NameAndType #15:#16 // identStr:Ljava/lang/String;
#43 = Class #55 // java/lang/System
#44 = NameAndType #56:#57 // out:Ljava/io/PrintStream;
#45 = Utf8 java/lang/StringBuilder
#46 = Utf8 szie :
#47 = NameAndType #58:#59 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#48 = NameAndType #58:#60 // append:(I)Ljava/lang/StringBuilder;
#49 = NameAndType #61:#62 // toString:()Ljava/lang/String;
#50 = Class #63 // java/io/PrintStream
#51 = NameAndType #64:#65 // println:(Ljava/lang/String;)V
#52 = Utf8 com/hx/test07/Test02LoopUpVTable
#53 = Utf8 java/util/AbstractCollection
#54 = Utf8 java/awt/event/ActionListener
#55 = Utf8 java/lang/System
#56 = Utf8 out
#57 = Utf8 Ljava/io/PrintStream;
#58 = Utf8 append
#59 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#60 = Utf8 (I)Ljava/lang/StringBuilder;
#61 = Utf8 toString
#62 = Utf8 ()Ljava/lang/String;
#63 = Utf8 java/io/PrintStream
#64 = Utf8 println
#65 = Utf8 (Ljava/lang/String;)V
int f01;
descriptor: I
flags:
int f02;
descriptor: I
flags:
int f03;
descriptor: I
flags:
int f04;
descriptor: I
flags:
int f05;
descriptor: I
flags:
public com.hx.test07.Test02LoopUpVTable();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/util/AbstractCollection."<init>":()V
4: aload_0
5: ldc #2 // String identStr
7: putfield #3 // Field identStr:Ljava/lang/String;
10: return
LineNumberTable:
line 13: 0
line 16: 4
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 this Lcom/hx/test07/Test02LoopUpVTable;
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=2, args_size=1
0: sipush 222
3: istore_1
4: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
7: new #5 // class java/lang/StringBuilder
10: dup
11: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
14: ldc #7 // String szie :
16: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: iload_1
20: invokevirtual #9 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
23: invokevirtual #10 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
26: invokevirtual #11 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
29: return
LineNumberTable:
line 29: 0
line 30: 4
line 32: 29
LocalVariableTable:
Start Length Slot Name Signature
0 30 0 args [Ljava/lang/String;
4 26 1 sz I
public int size();
descriptor: ()I
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: sipush 222
3: ireturn
LineNumberTable:
line 42: 0
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 this Lcom/hx/test07/Test02LoopUpVTable;
Signature: #38 // Ljava/util/AbstractCollection<Ljava/lang/String;>;Ljava/awt/event/ActionListener;
SourceFile: "Test02LoopUpVTable.java"
基于 vm 的调试
vtable 的初始化主要有几块
1. 复制一份基类的 vtable 作为基础, 站在巨人的肩膀上面
2. 遍历当前类的所有方法, 如果重写了基类的方法, 更新 vtable 中给定的索引对应的方法, 以及当方法的 vtable_index, 需要创建 vtableEntry 则新建一个 vtableEntry 并注册信息
3. 默认方法注册 vtable 的相关信息
4. miranda 方法注册 vtable 的相关信息(actionPerformed方法就是一个 miranda 方法)
来看一下 Test02LoopUpVTable 里面的各个方法的情况
1. "com.hx.test07.Test02LoopUpVTable.<init>()V"
因为是构造方法, 不需要注册 vtable, 直接返回, 并且不需要注册 vtableEntry
2. "com.hx.test07.Test02LoopUpVTable.main([Ljava/lang/String;)V"
因为是静态方法, 不需要注册 vtable, 直接返回, 并且不需要注册 vtableEntry
3. "com.hx.test07.Test02LoopUpVTable.size()I"
重写了基类的 size 方法, 更新了 vtable 里面已有的 size 方法对应的 Method, 并且更新了 当前方法对应的 vtable_index
4. "com.hx.test07.Test02LoopUpVTable.actionPerformed(Ljava/awt/event/ActionEvent;)V"
一个新的方法, 没有重写基类的任何方法, 新建一个 vtableEntry
如果你够仔细的话, 你会发现 这个 actionPerformed 方法并没有在源码里面出现?, 那么 怎么会记录到 methods 列表里面呢?
由于上面 actionPerformed 方法新建了一个 vtableEntry, 所以目前的 vtable 的长度是 24
下面的默认方法, miranda 方法注册 vtable 信息的步骤我们就不看了
接下来 我们主要看一下 InstanceKlass 和 vtable 的关系
KlassVtable 这个里面主要维护了 InstanceKlass 和 vtable 的关系, 以及 vtable 的一些附加信息
我们来看一下 KlassVtable 里面记录的东西
_klass 是在 0x00000007c008fc30 的地方, vtable 是在 0x00000007c008fdf0, 二者的偏移是 448 byte
(lldb) po this->table()
0x00000007c008fdf0
(lldb) po this->_klass()
0x00000007c008fc30
(lldb) po this->_tableOffset
448
(lldb) po 0x00000007c008fc30 - 0x00000007c008fdf0
-448
我们再来通过代码来看一下 他们之间的关系
InstanceKlass 占用的空间如下
vtable 的数据结构信息如下
其实就是一个 vtableEntry 的数组, 起始地址为 InstanceKlass 的最后一个字段(align对齐) 之后
每一个 vtableEntry 里面仅仅存放了一个 Method*, 占用 8 个字节
接下来我们看一下运行时实际的数据
# InstanceKlass of Test02LoopUpVTable 的数据信息如下
result = InstanceKlass * | 0x7c008fc30 0x00000007c008fc30
Klass = Klass
_annotations = Annotations * | 0x0 NULL
_package_entry = PackageEntry * | 0x7fc730cc7af0 0x00007fc730cc7af0
_array_klasses = Klass *volatile | 0x0 NULL
_constants = ConstantPool * | 0x114a6d2b0 0x0000000114a6d2b0
_inner_classes = Array<unsigned short> * | 0x11457f060 0x000000011457f060
_source_debug_extension = const char * | 0x0 NULL
_array_name = Symbol * | 0x0 NULL
_nonstatic_field_size = int 6
_static_field_size = int 0
_generic_signature_index = u2 38
_source_file_name_index = u2 40
_static_oop_field_count = u2 0
_java_fields_count = u2 6
_nonstatic_oop_map_size = int 1
_itable_len = int 31
_is_marked_dependent = bool false
_is_being_redefined = bool false
_misc_flags = u2 156
_minor_version = u2 0
_major_version = u2 52
_init_thread = Thread * | 0x0 NULL
_oop_map_cache = OopMapCache *volatile | 0x0 NULL
_member_names = MemberNameTable * | 0x0 NULL
_jni_ids = JNIid * | 0x0 NULL
_methods_jmethod_ids = jmethodID *volatile | 0x0 NULL
_dep_context = intptr_t 0
_osr_nmethods_head = nmethod * | 0x0 NULL
_breakpoints = BreakpointInfo * | 0x0 NULL
_previous_versions = InstanceKlass * | 0x0 NULL
_cached_class_file = JvmtiCachedClassFileData * | 0x0 NULL
_idnum_allocated_count = u2 4
_init_state = u1 1 '\\x01'
_reference_type = u1 0 '\\0'
_jvmti_cached_class_field_map = JvmtiCachedClassFieldMap * | 0x0 NULL
_verify_count = int 0
_methods = Array<Method *> * | 0x114a6d560 0x0000000114a6d560
_default_methods = Array<Method *> * | 0x114a6d588 0x0000000114a6d588
_local_interfaces = Array<Klass *> * | 0x114a6cee0 0x0000000114a6cee0
_transitive_interfaces = Array<Klass *> * | 0x114a6d190 0x0000000114a6d190
_method_ordering = Array<int> * | 0x11457f048 0x000000011457f048
_default_vtable_indices = Array<int> * | 0x114a6d700 0x0000000114a6d700
_fields = Array<unsigned short> * | 0x114a6cef8 0x0000000114a6cef8
# klassVtable 的数据列表如下
klassVtable for klass com.hx.test07.Test02LoopUpVTable (length 24):
vtableEntry finalize:
vtableEntry equals:
vtableEntry toString:
vtableEntry hashCode:
vtableEntry clone:
vtableEntry add:
vtableEntry remove:
vtableEntry clear:
vtableEntry isEmpty:
vtableEntry contains:
vtableEntry size:
vtableEntry toArray:
vtableEntry toArray:
vtableEntry iterator:
vtableEntry addAll:
vtableEntry containsAll:
vtableEntry retainAll:
vtableEntry removeAll:
vtableEntry spliterator:
vtableEntry stream:
vtableEntry forEach:
vtableEntry removeIf:
vtableEntry parallelStream:
vtableEntry actionPerformed:
# klassVtable->method_at(0)
method
- this oop: 0x000000011457fe38
- method holder: 'java/lang/Object'
- constants: 0x000000011457f110 constant pool [92] 0x000000011457f110 for 'java/lang/Object' cache=0x0000000114681938
- access: 0x4 protected
- name: 'finalize'
- signature: '()V'
- max stack: 1
- max locals: 1
- size of params: 1
- method size: 11
- vtable index: 0
- i2i entry: 0x00000001180d6700
- adapters: AHE@0x00007fc733837b80: 0xb0000000 i2c: 0x00000001181cb4e0 c2i: 0x00000001181cb5f4 c2iUV: 0x00000001181cb5c7
- compiled entry 0x00000001181cb5f4
- code size: 1
- code start: 0x000000011457fe18
- code end (excl): 0x000000011457fe19
- checked ex length: 1
- checked ex start: 0x000000011457fe2c
- linenumber start: 0x000000011457fe19
- localvar length: 1
- localvar start: 0x000000011457fe1e
# klassVtable->method_at(1)
method
- this oop: 0x000000011457f828
- method holder: 'java/lang/Object'
- constants: 0x000000011457f110 constant pool [92] 0x000000011457f110 for 'java/lang/Object' cache=0x0000000114681938
- access: 0x1 public
- name: 'equals'
- signature: '(Ljava/lang/Object;)Z'
- max stack: 3
- max locals: 2
- size of params: 2
- method size: 11
- vtable index: 1
- i2i entry: 0x00000001180d6700
- adapters: AHE@0x00007fc733837a60: 0xbb000000 i2c: 0x00000001181ca760 c2i: 0x00000001181ca878 c2iUV: 0x00000001181ca84b
- compiled entry 0x00000001181ca878
- code size: 11
- code start: 0x000000011457f7f8
- code end (excl): 0x000000011457f803
- checked ex length: 0
- linenumber start: 0x000000011457f803
- localvar length: 2
- localvar start: 0x000000011457f80e
# klassVtable->method_at(23)
method
- this oop: 0x0000000114a6d200
- method holder: 'com/hx/test07/Test02LoopUpVTable'
- constants: 0x0000000114a6d2b0 constant pool [76] 0x0000000114a6d2b0 for 'com/hx/test07/Test02LoopUpVTable' cache=0x0000000114a6d5b8
- access: 0x1041 public volatile synthetic
- name: 'actionPerformed'
- signature: '(Ljava/awt/event/ActionEvent;)V'
- max stack: 4
- max locals: 2
- size of params: 2
- method size: 11
- vtable index: 23
- i2i entry: 0x00000001180d6700
- adapters: AHE@0x00007fc731052c00: 0xbb000000 i2c: 0x000000011827e0e0 c2i: 0x000000011827e21e c2iUV: 0x000000011827e1f1
- compiled entry 0x000000011827e21e
- code size: 10
- code start: 0x0000000114a6d1f0
- code end (excl): 0x0000000114a6d1fa
- checked ex length: 0
- localvar length: 0
查看一下 InstanceKlass 对应的内存信息
(lldb) x 0x00000007c008fc30 -c 0x2a0
# InstanceKlass of Test02LoopUpVTable
0x7c008fc30: 30 27 a3 10 01 00 00 00 00 00 00 00 29 00 00 00 0'..........)...
0x7c008fc40: 40 00 00 00 00 00 00 00 a0 06 30 33 c7 7f 00 00 @.........03....
0x7c008fc50: 00 00 00 00 00 00 00 00 90 d1 a6 14 01 00 00 00 ................
0x7c008fc60: 70 0f 00 c0 07 00 00 00 f8 6e 01 c0 07 00 00 00 p........n......
0x7c008fc70: 30 fc 08 c0 07 00 00 00 00 00 00 00 00 00 00 00 0...............
0x7c008fc80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x7c008fc90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x7c008fca0: 70 8b b7 bf 07 00 00 00 f8 6e 01 c0 07 00 00 00 p........n......
0x7c008fcb0: 00 00 00 00 00 00 00 00 00 77 07 c0 07 00 00 00 .........w......
0x7c008fcc0: 00 00 00 00 00 00 00 00 60 06 c8 30 c7 7f 00 00 ........`..0....
0x7c008fcd0: 01 04 00 00 21 04 20 10 00 00 00 00 00 00 00 00 ....!. .........
0x7c008fce0: 05 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 ................
0x7c008fcf0: 01 00 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x7c008fd00: f0 7a cc 30 c7 7f 00 00 00 00 00 00 00 00 00 00 .z.0............
0x7c008fd10: b0 d2 a6 14 01 00 00 00 60 f0 57 14 01 00 00 00 ........`.W.....
0x7c008fd20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x7c008fd30: 06 00 00 00 00 00 00 00 26 00 28 00 00 00 06 00 ........&.(.....
0x7c008fd40: 01 00 00 00 1f 00 00 00 00 00 9c 00 00 00 34 00 ..............4.
0x7c008fd50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x7c008fd60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x7c008fd70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x7c008fd80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x7c008fd90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x7c008fda0: 04 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x7c008fdb0: 00 00 00 00 00 00 00 00 60 d5 a6 14 01 00 00 00 ........`.......
0x7c008fdc0: 88 d5 a6 14 01 00 00 00 e0 ce a6 14 01 00 00 00 ................
0x7c008fdd0: 90 d1 a6 14 01 00 00 00 48 f0 57 14 01 00 00 00 ........H.W.....
0x7c008fde0: 00 d7 a6 14 01 00 00 00 f8 ce a6 14 01 00 00 00 ................
# vtable of Test02LoopUpVTable
0x7c008fdf0: 38 fe 57 14 01 00 00 00 28 f8 57 14 01 00 00 00 8.W.....(.W.....
0x7c008fe00: 60 25 6a 14 01 00 00 00 40 f7 57 14 01 00 00 00 `%j.....@.W.....
0x7c008fe10: c8 f8 57 14 01 00 00 00 50 1e 6a 14 01 00 00 00 ..W.....P.j.....
0x7c008fe20: 58 1f 6a 14 01 00 00 00 30 24 6a 14 01 00 00 00 X.j.....0$j.....
0x7c008fe30: f0 17 6a 14 01 00 00 00 f0 18 6a 14 01 00 00 00 ..j.......j.....
0x7c008fe40: 38 d1 a6 14 01 00 00 00 90 1b 6a 14 01 00 00 00 8.........j.....
0x7c008fe50: 08 1a 6a 14 01 00 00 00 b0 16 6a 14 01 00 00 00 ..j.......j.....
0x7c008fe60: 48 21 6a 14 01 00 00 00 48 20 6a 14 01 00 00 00 H!j.....H j.....
0x7c008fe70: 58 23 6a 14 01 00 00 00 50 22 6a 14 01 00 00 00 X#j.....P"j.....
0x7c008fe80: c0 d9 69 14 01 00 00 00 70 da 69 14 01 00 00 00 ..i.....p.i.....
0x7c008fe90: f8 cd 69 14 01 00 00 00 c8 d6 69 14 01 00 00 00 ..i.......i.....
0x7c008fea0: 20 db 69 14 01 00 00 00 00 d2 a6 14 01 00 00 00 .i.............
# other memory
0x7c008feb0: 28 69 01 c0 07 00 00 00 c0 02 00 00 00 00 00 00 (i..............
0x7c008fec0: 18 6b 01 c0 07 00 00 00 d8 02 00 00 00 00 00 00 .k..............
可以看到的是 InstanceKlass of Test02LoopUpVTable 占用了 448 个字节, 最后8个字节为 _fields 的地址信息
然后接下来 24 * 8个字节为 vtable 的信息(24个元素), 第0个 1*8 个字节的数据为 finalize 的地址, 第1个 1*8 个字节的数据为 equals 的地址, ...., 第23个 1*8 的字节的数据为 actionPerformed 的地址信息
基于 HSDB 的调试
查看一下图中的信息, 是 Test02LoopUpVTable 对应的 InstanceKlass, 并且 vtable 有 24 个元素
Test02LoopUpVTable 的地址为 0x00000007c0061aa0
并且 InstanceKlass 中倒数第二个元素的地址为 0x000000010797b598, 最后一个元素的地址为 0x000000010797b728
查看一下 0x00000007c0061aa0 附近的 N*8 个 字节
-- public abstract class com.hx.test07.Test02LoopUpVTable [signature Ljava/util/AbstractCollection<Ljava/lang/String;>;Ljava/awt/event/ActionListener;] @0x00000007c0061aa0
0x00000007c0061aa0 0x0000000105eda270
0x00000007c0061aa8 0x0000003800000029
0x00000007c0061ab0 0x00007fa2fd808200
0x00000007c0061ab8 0x0000000000000000
0x00000007c0061ac0 0x000000010797b190
0x00000007c0061ac8 0x00000007c0000f28
0x00000007c0061ad0 0x00000007c0015e78
0x00000007c0061ad8 0x00000007c0061aa0
0x00000007c0061ae0 0x0000000000000000
0x00000007c0061ae8 0x0000000000000000
0x00000007c0061af0 0x0000000000000000
0x00000007c0061af8 0x0000000000000000
0x00000007c0061b00 0x0000000000000000
0x00000007c0061b08 0x0000000795cb1b58
0x00000007c0061b10 0x00000007c0015e78
0x00000007c0061b18 0x0000000000000000
0x00000007c0061b20 0x00000007c003e4d8
0x00000007c0061b28 0x00000007c0061828
0x00000007c0061b30 0x00007fa2fd803750
0x00000007c0061b38 0x1020042100000401
0x00000007c0061b40 0x0000000000000000
0x00000007c0061b48 0x0000000000000005
0x00000007c0061b50 0x0000000000000000
0x00000007c0061b58 0x00000000020d0000
0x00000007c0061b60 0x00000000ffff0001
0x00000007c0061b68 0x0000000000000000
0x00000007c0061b70 0x0000000000000000
0x00000007c0061b78 0x000000010797b2c0
0x00000007c0061b80 0x000000010756b058
0x00000007c0061b88 0x0000000000000000
0x00000007c0061b90 0x0000000000000000
0x00000007c0061b98 0x0000000000000006
0x00000007c0061ba0 0x0006000000280026
0x00000007c0061ba8 0x0027000000000001
0x00000007c0061bb0 0x0000000000340000
0x00000007c0061bb8 0x00007fa2fc80f000
0x00000007c0061bc0 0x0000001f00000018
0x00000007c0061bc8 0x00007fa2fb400cb0
0x00000007c0061bd0 0x0000000000000000
0x00000007c0061bd8 0x0000000000000000
0x00000007c0061be0 0x00007fa2fb63e070
0x00000007c0061be8 0x0000000000000000
0x00000007c0061bf0 0x0000000000000000
0x00000007c0061bf8 0x00007fa2fda05e90
0x00000007c0061c00 0x0000000000000000
0x00000007c0061c08 0x0000000000000000
0x00000007c0061c10 0x0000000000040004
0x00000007c0061c18 0x0000000000000000
0x00000007c0061c20 0x000000010797b570
0x00000007c0061c28 0x000000010797b5b0
0x00000007c0061c30 0x000000010797aef8
0x00000007c0061c38 0x000000010797b190
0x00000007c0061c40 0x000000010797b598
0x00000007c0061c48 0x000000010797b728
0x00000007c0061c50 0x000000010797af10
-- vtable of Test02LoopUpVTable start
0x00000007c0061c58 0x000000010756bc10
0x00000007c0061c60 0x000000010756b6e8
0x00000007c0061c68 0x00000001076373c0
0x00000007c0061c70 0x000000010756b640
0x00000007c0061c78 0x000000010756b778
0x00000007c0061c80 0x0000000107636e30
0x00000007c0061c88 0x0000000107636f10
0x00000007c0061c90 0x00000001076372d0
0x00000007c0061c98 0x0000000107636910
0x00000007c0061ca0 0x00000001076369e0
0x00000007c0061ca8 0x000000010797b138
0x00000007c0061cb0 0x0000000107636bf8
0x00000007c0061cb8 0x0000000107636ac0
0x00000007c0061cc0 0x00000001076367e8
0x00000007c0061cc8 0x0000000107637090
0x00000007c0061cd0 0x0000000107636fd0
0x00000007c0061cd8 0x0000000107637158
0x00000007c0061ce0 0x0000000107637220
0x00000007c0061ce8 0x00000001076308e8
0x00000007c0061cf0 0x0000000107630988
0x00000007c0061cf8 0x000000010762fde0
0x00000007c0061d00 0x0000000107630628
0x00000007c0061d08 0x0000000107630a28
0x00000007c0061d10 0x000000010797b210
-- other memory
0x00000007c0061d18 0x00000007c00156d8
0x00000007c0061d20 0x00000000000002b8
0x00000007c0061d28 0x00000007c00158c0
0x00000007c0061d30 0x00000000000002d0
0x00000007c0061d38 0x00000007c004d600
0x00000007c0061d40 0x0000000000000368
很容易 就能够定位到 倒数第二个, 倒数第一个元素, 然后 再加上 InstanceKlass 的 8 个字节的 对齐
因为 vtable 里面有 24 个元素, 因此接下来的 24*8 就是 vtable 里面存放的数据了
我们看一下 vtable 得第一个元素, 我们期望应该是一个 Method
果不其然 是一个 Method 的地址, 那么这两个 InstanceKlass, 和 _name_index 怎么参照, 可以看出其 是哪一个类的哪一个方法呢?
从 HSDB 中可以拿到 InstanceKlass 的列表如下
Create .class for all classes
public abstract class com.hx.test07.Test02LoopUpVTable [signature Ljava/util/AbstractCollection<Ljava/lang/String;>;Ljava/awt/event/ActionListener;] @0x00000007c0061aa0
public class com.intellij.rt.debugger.agent.CaptureAgent @0x00000007c0060028
final class com.intellij.rt.debugger.agent.CaptureAgent$1 @0x00000007c0060a38
class com.intellij.rt.debugger.agent.CaptureAgent$CaptureInstrumentor @0x00000007c0061828
class com.intellij.rt.debugger.agent.CaptureAgent$CaptureTransformer @0x00000007c0061028
class com.intellij.rt.debugger.agent.CaptureAgent$FieldKeyProvider @0x00000007c0060c40
class com.intellij.rt.debugger.agent.CaptureAgent$InstrumentPoint @0x00000007c0060400
abstract interface com.intellij.rt.debugger.agent.CaptureAgent$KeyProvider @0x00000007c0060218
class com.intellij.rt.debugger.agent.CaptureAgent$ParamKeyProvider @0x00000007c0060828
public class com.intellij.rt.debugger.agent.CaptureStorage @0x00000007c0049a08
final class com.intellij.rt.debugger.agent.CaptureStorage$1 [signature Ljava/lang/ThreadLocal<Ljava/util/Deque<Lcom/intellij/rt/debugger/agent/CaptureStorage$CapturedStack;>;>;] @0x00000007c0049bf8
public abstract interface java.awt.event.ActionListener @0x00000007c004d600
public class java.io.BufferedInputStream @0x00000007c0026a08
public class java.io.BufferedOutputStream @0x00000007c0027d08
public class java.io.BufferedReader @0x00000007c0030f98
public class java.io.BufferedWriter @0x00000007c002a2b8
public class java.io.ByteArrayInputStream @0x00000007c000e900
public class java.io.ByteArrayOutputStream @0x00000007c0043960
public abstract interface java.io.Closeable @0x00000007c000e4b0
class java.io.DefaultFileSystem @0x00000007c002a5b0
class java.io.ExpiringCache @0x00000007c002ad50
class java.io.ExpiringCache$1 [signature Ljava/util/LinkedHashMap<Ljava/lang/String;Ljava/io/ExpiringCache$Entry;>;] @0x00000007c002b3c0
class java.io.ExpiringCache$Entry @0x00000007c002c808
public class java.io.File [signature Ljava/lang/Object;Ljava/io/Serializable;Ljava/lang/Comparable<Ljava/io/File;>;] @0x00000007c000eb70
final [enum] class java.io.File$PathStatus [signature Ljava/lang/Enum<Ljava/io/File$PathStatus;>;] @0x00000007c002ba38
public final class java.io.FileDescriptor @0x00000007c0025ab8
final class java.io.FileDescriptor$1 @0x00000007c0025e98
public class java.io.FileInputStream @0x00000007c0025808
class java.io.FileInputStream$1 @0x00000007c0032e68
public class java.io.FileNotFoundException @0x00000007c0044970
public class java.io.FileOutputStream @0x00000007c0026500
class java.io.FileOutputStream$1 @0x00000007c004cb90
public final class java.io.FilePermission @0x00000007c00471b0
class java.io.FilePermission$1 [signature Ljava/lang/Object;Ljava/security/PrivilegedAction<Ljava/lang/String;>;] @0x00000007c00473e8
final class java.io.FilePermissionCollection @0x00000007c0047608
public class java.io.FileReader @0x00000007c00314f8
abstract class java.io.FileSystem @0x00000007c002a7a0
public class java.io.FilterInputStream @0x00000007c0026798
public class java.io.FilterOutputStream @0x00000007c00276e8
public abstract interface java.io.Flushable @0x00000007c00260b8
public class java.io.IOException @0x00000007c00446e8
public abstract class java.io.InputStream @0x00000007c000e698
public class java.io.InputStreamReader @0x00000007c0031260
public class java.io.ObjectStreamField [signature Ljava/lang/Object;Ljava/lang/Comparable<Ljava/lang/Object;>;] @0x00000007c00131b0
public abstract class java.io.OutputStream @0x00000007c00262a0
public class java.io.OutputStreamWriter @0x00000007c0028250
public class java.io.PrintStream @0x00000007c0027950
public abstract class java.io.Reader @0x00000007c0030d08
public abstract interface java.io.Serializable @0x00000007c0001118
public class java.io.StringReader @0x00000007c00480e0
class java.io.UnixFileSystem @0x00000007c002aa60
public abstract class java.io.Writer @0x00000007c0027f80
abstract class java.lang.AbstractStringBuilder @0x00000007c000d3e8
public abstract interface java.lang.Appendable @0x00000007c000d200
public class java.lang.ArithmeticException @0x00000007c00127a8
public class java.lang.ArrayStoreException @0x00000007c0004c50
public abstract interface java.lang.AutoCloseable @0x00000007c000e2c8
public final class java.lang.Boolean [signature Ljava/lang/Object;Ljava/io/Serializable;Ljava/lang/Comparable<Ljava/lang/Boolean;>;] @0x00000007c0010660
public class java.lang.BootstrapMethodError @0x00000007c000c658
public final class java.lang.Byte [signature Ljava/lang/Number;Ljava/lang/Comparable<Ljava/lang/Byte;>;] @0x00000007c0011100
public abstract interface java.lang.CharSequence @0x00000007c00014e8
public final class java.lang.Character [signature Ljava/lang/Object;Ljava/io/Serializable;Ljava/lang/Comparable<Ljava/lang/Character;>;] @0x00000007c0010868
abstract class java.lang.CharacterData @0x00000007c0037200
class java.lang.CharacterDataLatin1 @0x00000007c0037498
public final class java.lang.Class [signature <T:Ljava/lang/Object;>Ljava/lang/Object;Ljava/io/Serializable;Ljava/lang/reflect/GenericDeclaration;Ljava/lang/reflect/Type;Ljava/lang/reflect/AnnotatedElement;] @0x00000007c0001ef8
class java.lang.Class$1 [signature Ljava/lang/Object;Ljava/security/PrivilegedAction<Ljava/lang/Void;>;] @0x00000007c00220c0
final class java.lang.Class$3 [signature Ljava/lang/Object;Ljava/security/PrivilegedAction<Ljava/lang/Void;>;] @0x00000007c001ef50
class java.lang.Class$AnnotationData @0x00000007c0020150
class java.lang.Class$Atomic @0x00000007c001f350
class java.lang.Class$MethodArray @0x00000007c004d9d8
class java.lang.Class$ReflectionData [signature <T:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c001f158
public class java.lang.ClassCastException @0x00000007c00049c8
public abstract class java.lang.ClassLoader @0x00000007c0002368
final class java.lang.ClassLoader$3 [signature Ljava/lang/Object;Ljava/security/PrivilegedAction<Ljava/lang/Object;>;] @0x00000007c002c238
class java.lang.ClassLoader$NativeLibrary @0x00000007c002cc50
class java.lang.ClassLoader$ParallelLoaders @0x00000007c002f0c0
public class java.lang.ClassNotFoundException @0x00000007c0004228
public abstract class java.lang.ClassValue [signature <T:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c004aa60
class java.lang.ClassValue$ClassValueMap [signature Ljava/util/WeakHashMap<Ljava/lang/ClassValue$Identity;Ljava/lang/ClassValue$Entry<*>;>;] @0x00000007c0020938
class java.lang.ClassValue$Entry [signature <T:Ljava/lang/Object;>Ljava/lang/ref/WeakReference<Ljava/lang/ClassValue$Version<TT;>;>;] @0x00000007c004aef0
class java.lang.ClassValue$Identity @0x00000007c004b328
class java.lang.ClassValue$Version [signature <T:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c004b518
public abstract interface java.lang.Cloneable @0x00000007c0002180
public abstract interface java.lang.Comparable [signature <T:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c0001300
public final class java.lang.Compiler @0x00000007c002e6c8
final class java.lang.Compiler$1 [signature Ljava/lang/Object;Ljava/security/PrivilegedAction<Ljava/lang/Void;>;] @0x00000007c002e8b8
public final class java.lang.Double [signature Ljava/lang/Number;Ljava/lang/Comparable<Ljava/lang/Double;>;] @0x00000007c0010ec8
public abstract class java.lang.Enum [signature <E:Ljava/lang/Enum<TE;>;>Ljava/lang/Object;Ljava/lang/Comparable<TE;>;Ljava/io/Serializable;] @0x00000007c002b810
public class java.lang.Error @0x00000007c0002af0
public class java.lang.Exception @0x00000007c0003000
public final class java.lang.Float [signature Ljava/lang/Number;Ljava/lang/Comparable<Ljava/lang/Float;>;] @0x00000007c0010c90
public class java.lang.IllegalArgumentException @0x00000007c002e440
public class java.lang.IllegalMonitorStateException @0x00000007c0005670
public class java.lang.IllegalStateException @0x00000007c00492a8
public class java.lang.IncompatibleClassChangeError @0x00000007c001b280
public final class java.lang.Integer [signature Ljava/lang/Number;Ljava/lang/Comparable<Ljava/lang/Integer;>;] @0x00000007c0011570
class java.lang.Integer$IntegerCache @0x00000007c002d840
public class java.lang.InternalError @0x00000007c003a558
public class java.lang.InterruptedException @0x00000007c00178d0
public abstract interface java.lang.Iterable [signature <T:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c00156d8
public class java.lang.LinkageError @0x00000007c00044b8
public final class java.lang.Long [signature Ljava/lang/Number;Ljava/lang/Comparable<Ljava/lang/Long;>;] @0x00000007c00117a8
public final class java.lang.Math @0x00000007c001cf18
public class java.lang.NoClassDefFoundError @0x00000007c0004740
public class java.lang.NoSuchMethodError @0x00000007c001b508
public class java.lang.NullPointerException @0x00000007c0012520
public abstract class java.lang.Number @0x00000007c0010a70
public class java.lang.NumberFormatException @0x00000007c0048380
public class java.lang.Object @0x00000007c0000f28
public class java.lang.OutOfMemoryError @0x00000007c0005160
public class java.lang.Package @0x00000007c0045b60
public abstract interface java.lang.Readable @0x00000007c0030b20
public class java.lang.ReflectiveOperationException @0x00000007c0003fa0
public abstract interface java.lang.Runnable @0x00000007c00069e8
public class java.lang.Runtime @0x00000007c0025368
public class java.lang.RuntimeException @0x00000007c0003288
public final class java.lang.RuntimePermission @0x00000007c0014860
public class java.lang.SecurityManager @0x00000007c0003510
public final class java.lang.Short [signature Ljava/lang/Number;Ljava/lang/Comparable<Ljava/lang/Short;>;] @0x00000007c0011338
public class java.lang.StackOverflowError @0x00000007c00053e8
public final class java.lang.StackTraceElement @0x00000007c0010250
public final class java.lang.String [signature Ljava/lang/Object;Ljava/io/Serializable;Ljava/lang/Comparable<Ljava/lang/String;>;Ljava/lang/CharSequence;] @0x00000007c00016d0
class java.lang.String$CaseInsensitiveComparator [signature Ljava/lang/Object;Ljava/util/Comparator<Ljava/lang/String;>;Ljava/io/Serializable;] @0x00000007c00139c0
public final class java.lang.StringBuffer @0x00000007c000d838
public final class java.lang.StringBuilder @0x00000007c000dc88
class java.lang.StringCoding @0x00000007c0022928
class java.lang.StringCoding$StringDecoder @0x00000007c0023528
class java.lang.StringCoding$StringEncoder @0x00000007c002c030
public final class java.lang.System @0x00000007c0002678
final class java.lang.System$2 @0x00000007c002e1c8
class java.lang.SystemClassLoaderAction [signature Ljava/lang/Object;Ljava/security/PrivilegedExceptionAction<Ljava/lang/ClassLoader;>;] @0x00000007c003a148
class java.lang.Terminator @0x00000007c002ce60
final class java.lang.Terminator$1 @0x00000007c002d238
public class java.lang.Thread @0x00000007c0006bd0
public abstract interface java.lang.Thread$UncaughtExceptionHandler @0x00000007c0006eb0
public class java.lang.ThreadDeath @0x00000007c0002d78
public class java.lang.ThreadGroup @0x00000007c0007098
public class java.lang.ThreadLocal [signature <T:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c001eb00
class java.lang.ThreadLocal$ThreadLocalMap @0x00000007c0022b18
class java.lang.ThreadLocal$ThreadLocalMap$Entry [signature Ljava/lang/ref/WeakReference<Ljava/lang/ThreadLocal<*>;>;] @0x00000007c0022d68
public class java.lang.Throwable @0x00000007c0002868
public abstract class java.lang.VirtualMachineError @0x00000007c0004ed8
public final class java.lang.Void @0x00000007c004dc50
public abstract interface java.lang.annotation.Annotation @0x00000007c000b368
public abstract interface java.lang.instrument.ClassFileTransformer @0x00000007c0048608
public abstract interface java.lang.instrument.Instrumentation @0x00000007c003a7e0
public class java.lang.instrument.UnmodifiableClassException @0x00000007c00489d0
public abstract class java.lang.invoke.CallSite @0x00000007c000c8e0
public class java.lang.invoke.ConstantCallSite @0x00000007c000cb28
class java.lang.invoke.DirectMethodHandle @0x00000007c000ba38
class java.lang.invoke.LambdaForm @0x00000007c000c188
final class java.lang.invoke.MemberName @0x00000007c000bd70
class java.lang.invoke.MemberName$Factory @0x00000007c004b728
public abstract class java.lang.invoke.MethodHandle @0x00000007c000b738
abstract class java.lang.invoke.MethodHandleImpl @0x00000007c0049e28
final class java.lang.invoke.MethodHandleImpl$1 [signature Ljava/lang/Object;Ljava/security/PrivilegedAction<Ljava/lang/Void;>;] @0x00000007c004a018
final class java.lang.invoke.MethodHandleImpl$2 [signature Ljava/lang/Object;Ljava/util/function/Function<Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/LambdaForm;>;] @0x00000007c004a410
final class java.lang.invoke.MethodHandleImpl$3 [signature Ljava/lang/Object;Ljava/util/function/Function<Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/LambdaForm;>;] @0x00000007c004a648
final class java.lang.invoke.MethodHandleImpl$4 [signature Ljava/lang/ClassValue<[Ljava/lang/invoke/MethodHandle;>;] @0x00000007c004aca8
class java.lang.invoke.MethodHandleNatives @0x00000007c000bf98
class java.lang.invoke.MethodHandleStatics @0x00000007c004b968
final class java.lang.invoke.MethodHandleStatics$1 [signature Ljava/lang/Object;Ljava/security/PrivilegedAction<Ljava/lang/Void;>;] @0x00000007c004bb58
public final class java.lang.invoke.MethodType @0x00000007c000c460
public class java.lang.invoke.MutableCallSite @0x00000007c000cd70
public class java.lang.invoke.VolatileCallSite @0x00000007c000cfb8
class java.lang.ref.FinalReference [signature <T:Ljava/lang/Object;>Ljava/lang/ref/Reference<TT;>;] @0x00000007c0005f40
final class java.lang.ref.Finalizer [signature Ljava/lang/ref/FinalReference<Ljava/lang/Object;>;] @0x00000007c0006598
class java.lang.ref.Finalizer$FinalizerThread @0x00000007c001d108
public class java.lang.ref.PhantomReference [signature <T:Ljava/lang/Object;>Ljava/lang/ref/Reference<TT;>;] @0x00000007c0006158
public abstract class java.lang.ref.Reference [signature <T:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c00058f8
final class java.lang.ref.Reference$1 @0x00000007c001ae88
class java.lang.ref.Reference$Lock @0x00000007c0017400
class java.lang.ref.Reference$ReferenceHandler @0x00000007c00175f0
public class java.lang.ref.ReferenceQueue [signature <T:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c00067b8
class java.lang.ref.ReferenceQueue$Lock @0x00000007c001a6f0
class java.lang.ref.ReferenceQueue$Null [signature <S:Ljava/lang/Object;>Ljava/lang/ref/ReferenceQueue<TS;>;] @0x00000007c001a4b8
public class java.lang.ref.SoftReference [signature <T:Ljava/lang/Object;>Ljava/lang/ref/Reference<TT;>;] @0x00000007c0005b10
public class java.lang.ref.WeakReference [signature <T:Ljava/lang/Object;>Ljava/lang/ref/Reference<TT;>;] @0x00000007c0005d28
public class java.lang.reflect.AccessibleObject @0x00000007c0007fb0
public abstract interface java.lang.reflect.AnnotatedElement @0x00000007c0001940
public final class java.lang.reflect.Array @0x00000007c0032a40
public final class java.lang.reflect.Constructor [signature <T:Ljava/lang/Object;>Ljava/lang/reflect/Executable;] @0x00000007c00091f0
public abstract class java.lang.reflect.Executable @0x00000007c0008948
public final class java.lang.reflect.Field @0x00000007c0008430
public abstract interface java.lang.reflect.GenericDeclaration @0x00000007c0001b28
public abstract interface java.lang.reflect.Member @0x00000007c0008248
public final class java.lang.reflect.Method @0x00000007c0008d98
public class java.lang.reflect.Modifier @0x00000007c0020d90
public final class java.lang.reflect.Parameter @0x00000007c0008700
class java.lang.reflect.ReflectAccess @0x00000007c0021168
public final class java.lang.reflect.ReflectPermission @0x00000007c0014c98
public abstract interface java.lang.reflect.Type @0x00000007c0001d10
class java.net.Parts @0x00000007c00377e0
public final class java.net.URI [signature Ljava/lang/Object;Ljava/lang/Comparable<Ljava/net/URI;>;Ljava/io/Serializable;] @0x00000007c0049530
class java.net.URI$Parser @0x00000007c0049740
public final class java.net.URL @0x00000007c000f2a0
public class java.net.URLClassLoader @0x00000007c000ef00
class java.net.URLClassLoader$1 [signature Ljava/lang/Object;Ljava/security/PrivilegedExceptionAction<Ljava/lang/Class<*>;>;] @0x00000007c003b368
final class java.net.URLClassLoader$7 @0x00000007c00300c0
public abstract class java.net.URLConnection @0x00000007c0046450
public abstract class java.net.URLStreamHandler @0x00000007c00379f0
public abstract interface java.net.URLStreamHandlerFactory @0x00000007c002eac0
class java.nio.Bits @0x00000007c00298b0
final class java.nio.Bits$1 @0x00000007c002a0a0
public abstract class java.nio.Buffer @0x00000007c0010448
public abstract class java.nio.ByteBuffer [signature Ljava/nio/Buffer;Ljava/lang/Comparable<Ljava/nio/ByteBuffer;>;] @0x00000007c0029148
public final class java.nio.ByteOrder @0x00000007c0029aa0
public abstract class java.nio.CharBuffer [signature Ljava/nio/Buffer;Ljava/lang/Comparable<Ljava/nio/CharBuffer;>;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/Readable;] @0x00000007c0031a78
class java.nio.DirectByteBuffer @0x00000007c003fac8
class java.nio.DirectLongBufferU @0x00000007c0040210
class java.nio.HeapByteBuffer @0x00000007c00294f0
class java.nio.HeapCharBuffer @0x00000007c0031e30
public abstract class java.nio.LongBuffer [signature Ljava/nio/Buffer;Ljava/lang/Comparable<Ljava/nio/LongBuffer;>;] @0x00000007c003ff60
public abstract class java.nio.MappedByteBuffer @0x00000007c003f6e8
public abstract class java.nio.charset.Charset [signature Ljava/lang/Object;Ljava/lang/Comparable<Ljava/nio/charset/Charset;>;] @0x00000007c001d3e8
public abstract class java.nio.charset.CharsetDecoder @0x00000007c0023918
public abstract class java.nio.charset.CharsetEncoder @0x00000007c0028c68
public class java.nio.charset.CoderResult @0x00000007c0032200
final class java.nio.charset.CoderResult$1 @0x00000007c0032630
final class java.nio.charset.CoderResult$2 @0x00000007c0032838
abstract class java.nio.charset.CoderResult$Cache @0x00000007c0032428
public class java.nio.charset.CodingErrorAction @0x00000007c0023df8
public final class java.nio.charset.StandardCharsets @0x00000007c003d310
public abstract class java.nio.charset.spi.CharsetProvider @0x00000007c001d630
public abstract interface java.nio.file.Path [signature Ljava/lang/Object;Ljava/lang/Comparable<Ljava/nio/file/Path;>;Ljava/lang/Iterable<Ljava/nio/file/Path;>;Ljava/nio/file/Watchable;] @0x00000007c002be48
public abstract interface java.nio.file.Watchable @0x00000007c002bc60
public final class java.security.AccessControlContext @0x00000007c0003a78
public final class java.security.AccessController @0x00000007c0014aa8
public final class java.security.AllPermission @0x00000007c0047828
public abstract class java.security.BasicPermission @0x00000007c0014618
final class java.security.BasicPermissionCollection @0x00000007c0047c88
public final class java.security.CodeSigner @0x00000007c0043358
public class java.security.CodeSource @0x00000007c0010028
public abstract interface java.security.Guard @0x00000007c0014200
public abstract class java.security.Permission @0x00000007c00143e8
public abstract class java.security.PermissionCollection @0x00000007c0046018
public final class java.security.Permissions @0x00000007c0046230
public abstract interface java.security.Principal @0x00000007c0038a78
public abstract interface java.security.PrivilegedAction [signature <T:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c0014ee0
public class java.security.PrivilegedActionException @0x00000007c0044bf8
public abstract interface java.security.PrivilegedExceptionAction [signature <T:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c00270f0
public class java.security.ProtectionDomain @0x00000007c0003868
final class java.security.ProtectionDomain$2 @0x00000007c0038670
class java.security.ProtectionDomain$JavaSecurityAccessImpl @0x00000007c0038268
final class java.security.ProtectionDomain$Key @0x00000007c0038880
public class java.security.SecureClassLoader @0x00000007c0003c70
public final class java.security.UnresolvedPermission @0x00000007c0047a58
public abstract class java.security.cert.Certificate @0x00000007c00152d0
public abstract class java.util.AbstractCollection [signature <E:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Collection<TE;>;] @0x00000007c0015e78
public abstract class java.util.AbstractList [signature <E:Ljava/lang/Object;>Ljava/util/AbstractCollection<TE;>;Ljava/util/List<TE;>;] @0x00000007c00161c8
public abstract class java.util.AbstractMap [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<TK;TV;>;] @0x00000007c00190e0
public abstract class java.util.AbstractSequentialList [signature <E:Ljava/lang/Object;>Ljava/util/AbstractList<TE;>;] @0x00000007c0041bb0
public abstract class java.util.AbstractSet [signature <E:Ljava/lang/Object;>Ljava/util/AbstractCollection<TE;>;Ljava/util/Set<TE;>;] @0x00000007c0018458
public class java.util.ArrayDeque [signature <E:Ljava/lang/Object;>Ljava/util/AbstractCollection<TE;>;Ljava/util/Deque<TE;>;Ljava/lang/Cloneable;Ljava/io/Serializable;] @0x00000007c003e4d8
public class java.util.ArrayList [signature <E:Ljava/lang/Object;>Ljava/util/AbstractList<TE;>;Ljava/util/List<TE;>;Ljava/util/RandomAccess;Ljava/lang/Cloneable;Ljava/io/Serializable;] @0x00000007c0017b58
public class java.util.Arrays @0x00000007c0021458
public class java.util.BitSet @0x00000007c0033290
public abstract interface java.util.Collection [signature <E:Ljava/lang/Object;>Ljava/lang/Object;Ljava/lang/Iterable<TE;>;] @0x00000007c00158c0
public class java.util.Collections @0x00000007c0018080
class java.util.Collections$EmptyList [signature <E:Ljava/lang/Object;>Ljava/util/AbstractList<TE;>;Ljava/util/RandomAccess;Ljava/io/Serializable;] @0x00000007c0018c20
class java.util.Collections$EmptyMap [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/AbstractMap<TK;TV;>;Ljava/io/Serializable;] @0x00000007c0019468
class java.util.Collections$EmptySet [signature <E:Ljava/lang/Object;>Ljava/util/AbstractSet<TE;>;Ljava/io/Serializable;] @0x00000007c0018838
class java.util.Collections$SetFromMap [signature <E:Ljava/lang/Object;>Ljava/util/AbstractSet<TE;>;Ljava/util/Set<TE;>;Ljava/io/Serializable;] @0x00000007c002f700
class java.util.Collections$SynchronizedCollection [signature <E:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Collection<TE;>;Ljava/io/Serializable;] @0x00000007c00243e0
class java.util.Collections$SynchronizedSet [signature <E:Ljava/lang/Object;>Ljava/util/Collections$SynchronizedCollection<TE;>;Ljava/util/Set<TE;>;] @0x00000007c0024740
class java.util.Collections$UnmodifiableCollection [signature <E:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Collection<TE;>;Ljava/io/Serializable;] @0x00000007c00197f8
class java.util.Collections$UnmodifiableList [signature <E:Ljava/lang/Object;>Ljava/util/Collections$UnmodifiableCollection<TE;>;Ljava/util/List<TE;>;] @0x00000007c0019b50
class java.util.Collections$UnmodifiableRandomAccessList [signature <E:Ljava/lang/Object;>Ljava/util/Collections$UnmodifiableList<TE;>;Ljava/util/RandomAccess;] @0x00000007c001a000
public abstract interface java.util.Comparator [signature <T:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c00137d8
public abstract interface java.util.Deque [signature <E:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Queue<TE;>;] @0x00000007c003e2f0
public abstract class java.util.Dictionary [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c0007530
public abstract interface java.util.Enumeration [signature <E:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c0024d20
public abstract interface java.util.EventListener @0x00000007c004d418
public class java.util.HashMap [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/AbstractMap<TK;TV;>;Ljava/util/Map<TK;TV;>;Ljava/lang/Cloneable;Ljava/io/Serializable;] @0x00000007c001bd40
class java.util.HashMap$Node [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map$Entry<TK;TV;>;] @0x00000007c001c310
final class java.util.HashMap$TreeNode [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/LinkedHashMap$Entry<TK;TV;>;] @0x00000007c0032c30
public class java.util.HashSet [signature <E:Ljava/lang/Object;>Ljava/util/AbstractSet<TE;>;Ljava/util/Set<TE;>;Ljava/lang/Cloneable;Ljava/io/Serializable;] @0x00000007c0038e40
public class java.util.Hashtable [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/Dictionary<TK;TV;>;Ljava/util/Map<TK;TV;>;Ljava/lang/Cloneable;Ljava/io/Serializable;] @0x00000007c0007758
class java.util.Hashtable$Entry [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map$Entry<TK;TV;>;] @0x00000007c001caf0
class java.util.Hashtable$EntrySet [signature Ljava/util/AbstractSet<Ljava/util/Map$Entry<TK;TV;>;>;] @0x00000007c0023ff0
class java.util.Hashtable$Enumerator [signature <T:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Enumeration<TT;>;Ljava/util/Iterator<TT;>;] @0x00000007c00250f0
public abstract interface java.util.Iterator [signature <E:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c0024f08
public class java.util.LinkedHashMap [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/HashMap<TK;TV;>;Ljava/util/Map<TK;TV;>;] @0x00000007c002af70
class java.util.LinkedHashMap$Entry [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/HashMap$Node<TK;TV;>;] @0x00000007c002ca20
abstract class java.util.LinkedHashMap$LinkedHashIterator @0x00000007c0039d20
final class java.util.LinkedHashMap$LinkedKeyIterator [signature Ljava/util/LinkedHashMap<TK;TV;>.LinkedHashIterator;Ljava/util/Iterator<TK;>;] @0x00000007c0039f18
final class java.util.LinkedHashMap$LinkedKeySet [signature Ljava/util/AbstractSet<TK;>;] @0x00000007c0039938
public class java.util.LinkedList [signature <E:Ljava/lang/Object;>Ljava/util/AbstractSequentialList<TE;>;Ljava/util/List<TE;>;Ljava/util/Deque<TE;>;Ljava/lang/Cloneable;Ljava/io/Serializable;] @0x00000007c0042068
class java.util.LinkedList$Node [signature <E:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c0042818
public abstract interface java.util.List [signature <E:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Collection<TE;>;] @0x00000007c0015aa8
public final class java.util.Locale @0x00000007c00335a8
class java.util.Locale$Cache [signature Lsun/util/locale/LocaleObjectCache<Ljava/util/Locale$LocaleKey;Ljava/util/Locale;>;] @0x00000007c00339c0
final class java.util.Locale$LocaleKey @0x00000007c0036e18
public abstract interface java.util.Map [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c0007348
public abstract interface java.util.Map$Entry [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c001c128
public final class java.util.Objects @0x00000007c0024b30
public class java.util.Properties [signature Ljava/util/Hashtable<Ljava/lang/Object;Ljava/lang/Object;>;] @0x00000007c0007b30
public abstract interface java.util.Queue [signature <E:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Collection<TE;>;] @0x00000007c003e108
public abstract interface java.util.RandomAccess @0x00000007c0015c90
public abstract interface java.util.Set [signature <E:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Collection<TE;>;] @0x00000007c0018270
public class java.util.Stack [signature <E:Ljava/lang/Object;>Ljava/util/Vector<TE;>;] @0x00000007c0016bf0
public class java.util.StringTokenizer [signature Ljava/lang/Object;Ljava/util/Enumeration<Ljava/lang/Object;>;] @0x00000007c00304d8
public class java.util.Vector [signature <E:Ljava/lang/Object;>Ljava/util/AbstractList<TE;>;Ljava/util/List<TE;>;Ljava/util/RandomAccess;Ljava/lang/Cloneable;Ljava/io/Serializable;] @0x00000007c0016680
public class java.util.WeakHashMap [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/AbstractMap<TK;TV;>;Ljava/util/Map<TK;TV;>;] @0x00000007c0020568
class java.util.WeakHashMap$Entry [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/ref/WeakReference<Ljava/lang/Object;>;Ljava/util/Map$Entry<TK;TV;>;] @0x00000007c002f2b0
class java.util.WeakHashMap$KeySet [signature Ljava/util/AbstractSet<TK;>;] @0x00000007c002faf0
public class java.util.concurrent.ConcurrentHashMap [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/AbstractMap<TK;TV;>;Ljava/util/concurrent/ConcurrentMap<TK;TV;>;Ljava/io/Serializable;] @0x00000007c0033dd0
abstract class java.util.concurrent.ConcurrentHashMap$CollectionView [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;E:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Collection<TE;>;Ljava/io/Serializable;] @0x00000007c0035828
final class java.util.concurrent.ConcurrentHashMap$CounterCell @0x00000007c0035458
final class java.util.concurrent.ConcurrentHashMap$EntrySetView [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/concurrent/ConcurrentHashMap$CollectionView<TK;TV;Ljava/util/Map$Entry<TK;TV;>;>;Ljava/util/Set<Ljava/util/Map$Entry<TK;TV;>;>;Ljava/io/Serializable;] @0x00000007c0036220
final class java.util.concurrent.ConcurrentHashMap$ForwardingNode [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/concurrent/ConcurrentHashMap$Node<TK;TV;>;] @0x00000007c0047ea8
public class java.util.concurrent.ConcurrentHashMap$KeySetView [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/concurrent/ConcurrentHashMap$CollectionView<TK;TV;TK;>;Ljava/util/Set<TK;>;Ljava/io/Serializable;] @0x00000007c0035b48
class java.util.concurrent.ConcurrentHashMap$Node [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map$Entry<TK;TV;>;] @0x00000007c0035040
class java.util.concurrent.ConcurrentHashMap$Segment [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/concurrent/locks/ReentrantLock;Ljava/io/Serializable;] @0x00000007c00347f8
final class java.util.concurrent.ConcurrentHashMap$ValuesView [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/concurrent/ConcurrentHashMap$CollectionView<TK;TV;TV;>;Ljava/util/Collection<TV;>;Ljava/io/Serializable;] @0x00000007c0035f00
public abstract interface java.util.concurrent.ConcurrentMap [signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<TK;TV;>;] @0x00000007c0033be8
public class java.util.concurrent.atomic.AtomicBoolean @0x00000007c004c358
public class java.util.concurrent.atomic.AtomicInteger @0x00000007c001ed30
public class java.util.concurrent.atomic.AtomicLong @0x00000007c0029c98
public abstract class java.util.concurrent.atomic.AtomicReferenceFieldUpdater [signature <T:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;] @0x00000007c0026ca0
final class java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl [signature <T:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/ut以上是关于33 根据 InstanceKlass 查找 vtable 的数据的主要内容,如果未能解决你的问题,请参考以下文章
35 根据 InstanceKlass 查找 itable 的数据
35 根据 InstanceKlass 查找 itable 的数据
51 java.lang.Class/java.lang.ClassLoader/InstanceKlass/ClassloaderData 的卸载
51 java.lang.Class/java.lang.ClassLoader/InstanceKlass/ClassloaderData 的卸载