JVM常量池中的数据结构

常量池(constant_pool[])

  • 1字节的tag
  • 不同的tag对应着后续不同的数据长度
    • 2~N个字节
<1byte>tag <2~N>data

常量池数据结构类型

type数值16进制Class版本JavaSE版本
CONSTANT_Class70x0745.31.0.2
CONSTANT_Fieldref90x0945.31.0.2
CONSTANT_Methodref100x0a45.31.0.2
CONSTANT_InterfaceMethodref110x0b45.31.0.2
CONSTANT_String80x0845.31.0.2
CONSTANT_Integer30x0345.31.0.2
CONSTANT_Float40x0445.31.0.2
CONSTANT_Long50x0545.31.0.2
CONSTANT_Double60x0645.31.0.2
CONSTANT_NameAndType120x0c45.31.0.2
CONSTANT_Utf810x0145.31.0.2
CONSTANT_MethodHandle150x0f51.07
CONSTANT_MethodType160x1051.07
CONSTANT_InvokeDynamic180x1251.07
CONSTANT_Module190x1353.09
CONSTANT_Package200x1453.09

数据结构

  • CONSTANT_Class_info
CONSTANT_Class_info {
    u1 tag;
    u2 name_index;              //CONSTANT_Utf8_info
}
  • CONSTANT_Fieldref_info
CONSTANT_Fieldref_info {
    u1 tag;
    u2 class_index;             //CONSTANT_Class_info
    u2 name_and_type_index;     //CONSTANT_NameAndType_info
}
  • CONSTANT_Methodref_info
CONSTANT_Methodref_info {
    u1 tag;
    u2 class_index;             //CONSTANT_Class_info
    u2 name_and_type_index;     //CONSTANT_NameAndType_info
}
  • CONSTANT_InterfaceMethodref_info
CONSTANT_InterfaceMethodref_info {
    u1 tag;
    u2 class_index;             //CONSTANT_Class_info
    u2 name_and_type_index;     //CONSTANT_NameAndType_info
}
  • CONSTANT_String_info
CONSTANT_String_info {
    u1 tag;
    u2 string_index;            //CONSTANT_Utf8_info
}
  • CONSTANT_Integer_info
CONSTANT_Integer_info {
    u1 tag;
    u4 bytes;                   //直接数
}
  • CONSTANT_Float_info
CONSTANT_Float_info {
    u1 tag;
    u4 bytes;                   //直接数
}
  • CONSTANT_Long_info
CONSTANT_Long_info {
    u1 tag;
    u4 high_bytes;              //直接数
    u4 low_bytes;               //直接数
}
  • CONSTANT_Double_info
CONSTANT_Double_info {
    u1 tag;
    u4 high_bytes;              //直接数
    u4 low_bytes;               //直接数
}
  • CONSTANT_NameAndType_info
CONSTANT_NameAndType_info {
    u1 tag;
    u2 name_index;              //CONSTANT_Utf8_info
    u2 descriptor_index;        //CONSTANT_Utf8_info
}
  • CONSTANT_Utf8_info
CONSTANT_Utf8_info {
    u1 tag;
    u2 length;                  //直接数
    u1 bytes[length];           //改进版的UTF8
}

与标准UTF8不同的地方:

  1. null字符使用2字节格式,而不是标准的1字节
    • 避免内嵌null时分隔问题
  2. JVM仅使用1/2/3字节的UTF8,不使用标准中4字节格式
    • 使用2个3字节UTF8来表示
  3. 字符串结尾不会追加null终止符
    • 紧凑
  • CONSTANT_MethodHandle_info
CONSTANT_MethodHandle_info {
    u1 tag;                     //15
    u1 reference_kind;          //1~9
    u2 reference_index;         //取决于kind
}
kind说明index版本
1REF_getFieldCONSTANT_Fieldref_info
2REF_getStaticCONSTANT_Fieldref_info
3REF_putFieldCONSTANT_Fieldref_info
4REF_putStaticCONSTANT_Fieldref_info
5REF_invokeVirtualCONSTANT_Methodref_info
8REF_newInvokeSpecialCONSTANT_Methodref_info
6REF_invokeStaticCONSTANT_Methodref_info52.0-
6REF_invokeStaticCONSTANT_Methodref_info52.0-
7REF_invokeSpecialCONSTANT_Methodref_info / CONSTANT_InterfaceMethodref_info52.0+
7REF_invokeSpecialCONSTANT_Methodref_info / CONSTANT_InterfaceMethodref_info52.0+
9REF_invokeInterfaceCONSTANT_InterfaceMethodref_info
  • CONSTANT_MethodType_info
CONSTANT_MethodType_info {
    u1 tag;                         //16
    u2 descriptor_index;            //CONSTANT_Utf8_info
}
  • CONSTANT_InvokeDynamic_info
CONSTANT_InvokeDynamic_info {
    u1 tag;                         //18
    u2 bootstrap_method_attr_index; //index
into the bootstrap_methods array of the bootstrap method table
    u2 name_and_type_index;         //CONSTANT_NameAndType_info
}
  • CONSTANT_Module_info
CONSTANT_Module_info {
    u1 tag;                         //19
    u2 name_index;                  //CONSTANT_Utf8_info
}
  • CONSTANT_Package_info
CONSTANT_Package_info {
    u1 tag;                         //20
    u2 name_index;                  //CONSTANT_Utf8_info
}

转载于:https://my.oschina.net/roccn/blog/1544507

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值