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 的卸载

IT菜鸟之BIOS和VT

34 新增的 miranda 方法 & 新增的常量池 entry