jvm深入理解-各种池

本文章基于jdk版本1.8

1、class常量池(constant pool)

class常量池可以理解为class文件的资源仓库,class文件包含类版本信息、字段、方法、接口等描述信息以及class常量池,class常量池存放class文件在运行期间编译的各种字面量和符号引用。

使用javap -v  SkuOperateLogVo.class查看class文件

Classfile /E:/idea_ry/crpcg-s2c-oms/oms-api/target/classes/com/imall/s2c/log/vo/SkuOperateLogVo.class
  Last modified 2023-4-11; size 3072 bytes
  MD5 checksum ac45ff782809766249c77db53fa08acd
  Compiled from "SkuOperateLogVo.java"
public class com.imall.s2c.log.vo.SkuOperateLogVo
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
    #1 = Methodref          #24.#85       // java/lang/Object."<init>":()V
    #2 = Fieldref           #6.#86        // com/imall/s2c/log/vo/SkuOperateLogVo.operator:Ljava/lang/String;

    #3 = Fieldref           #6.#87        // com/imall/s2c/log/vo/SkuOperateLogVo.skuId:Ljava/lang/Long;
    #4 = Fieldref           #6.#88        // com/imall/s2c/log/vo/SkuOperateLogVo.operateContent:Ljava/lang/S
tring;
    #5 = Fieldref           #6.#89        // com/imall/s2c/log/vo/SkuOperateLogVo.createTime:Ljava/lang/Strin
g;
    #6 = Class              #90           // com/imall/s2c/log/vo/SkuOperateLogVo
    #7 = Methodref          #6.#91        // com/imall/s2c/log/vo/SkuOperateLogVo.canEqual:(Ljava/lang/Object
;)Z
    #8 = Methodref          #6.#92        // com/imall/s2c/log/vo/SkuOperateLogVo.getOperator:()Ljava/lang/St
ring;
    #9 = Methodref          #24.#93       // java/lang/Object.equals:(Ljava/lang/Object;)Z
   #10 = Methodref          #6.#94        // com/imall/s2c/log/vo/SkuOperateLogVo.getSkuId:()Ljava/lang/Long;

   #11 = Methodref          #6.#95        // com/imall/s2c/log/vo/SkuOperateLogVo.getOperateContent:()Ljava/l
ang/String;
   #12 = Methodref          #6.#96        // com/imall/s2c/log/vo/SkuOperateLogVo.getCreateTime:()Ljava/lang/
String;
   #13 = Methodref          #24.#97       // java/lang/Object.hashCode:()I
   #14 = Class              #98           // java/lang/StringBuilder
   #15 = Methodref          #14.#85       // java/lang/StringBuilder."<init>":()V
   #16 = String             #99           // SkuOperateLogVo(operator=
   #17 = Methodref          #14.#100      // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/St
ringBuilder;
   #18 = String             #101          // , skuId=
   #19 = Methodref          #14.#102      // java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/St
ringBuilder;
   #20 = String             #103          // , operateContent=
   #21 = String             #104          // , createTime=
   #22 = String             #105          // )
   #23 = Methodref          #14.#106      // java/lang/StringBuilder.toString:()Ljava/lang/String;
   #24 = Class              #107          // java/lang/Object
   #25 = Utf8               operator
   #26 = Utf8               Ljava/lang/String;
   #27 = Utf8               RuntimeVisibleAnnotations
   #28 = Utf8               Lio/swagger/annotations/ApiModelProperty;
   #29 = Utf8               value
   #30 = Utf8               操作人
   #31 = Utf8               skuId
   #32 = Utf8               Ljava/lang/Long;
   #33 = Utf8               operateContent
   #34 = Utf8               操作内容
   #35 = Utf8               createTime
   #36 = Utf8               操作时间
   #37 = Utf8               <init>
   #38 = Utf8               ()V
   #39 = Utf8               Code
   #40 = Utf8               LineNumberTable
   #41 = Utf8               LocalVariableTable
   #42 = Utf8               this
   #43 = Utf8               Lcom/imall/s2c/log/vo/SkuOperateLogVo;
   #44 = Utf8               getOperator
   #45 = Utf8               ()Ljava/lang/String;
   #46 = Utf8               getSkuId
   #47 = Utf8               ()Ljava/lang/Long;
   #48 = Utf8               getOperateContent
   #49 = Utf8               getCreateTime
   #50 = Utf8               setOperator
   #51 = Utf8               (Ljava/lang/String;)V
   #52 = Utf8               setSkuId
   #53 = Utf8               (Ljava/lang/Long;)V
   #54 = Utf8               setOperateContent
   #55 = Utf8               setCreateTime
   #56 = Utf8               equals
   #57 = Utf8               (Ljava/lang/Object;)Z
   #58 = Utf8               o
   #59 = Utf8               Ljava/lang/Object;
   #60 = Utf8               other
   #61 = Utf8               this$operator
   #62 = Utf8               other$operator
   #63 = Utf8               this$skuId
   #64 = Utf8               other$skuId
   #65 = Utf8               this$operateContent
   #66 = Utf8               other$operateContent
   #67 = Utf8               this$createTime
   #68 = Utf8               other$createTime
   #69 = Utf8               StackMapTable
   #70 = Class              #90           // com/imall/s2c/log/vo/SkuOperateLogVo
   #71 = Class              #107          // java/lang/Object
   #72 = Utf8               canEqual
   #73 = Utf8               hashCode
   #74 = Utf8               ()I
   #75 = Utf8               PRIME
   #76 = Utf8               I
   #77 = Utf8               result
   #78 = Utf8               $operator
   #79 = Utf8               $skuId
   #80 = Utf8               $operateContent
   #81 = Utf8               $createTime
   #82 = Utf8               toString
   #83 = Utf8               SourceFile
   #84 = Utf8               SkuOperateLogVo.java
   #85 = NameAndType        #37:#38       // "<init>":()V
   #86 = NameAndType        #25:#26       // operator:Ljava/lang/String;
   #87 = NameAndType        #31:#32       // skuId:Ljava/lang/Long;
   #88 = NameAndType        #33:#26       // operateContent:Ljava/lang/String;
   #89 = NameAndType        #35:#26       // createTime:Ljava/lang/String;
   #90 = Utf8               com/imall/s2c/log/vo/SkuOperateLogVo
   #91 = NameAndType        #72:#57       // canEqual:(Ljava/lang/Object;)Z
   #92 = NameAndType        #44:#45       // getOperator:()Ljava/lang/String;
   #93 = NameAndType        #56:#57       // equals:(Ljava/lang/Object;)Z
   #94 = NameAndType        #46:#47       // getSkuId:()Ljava/lang/Long;
   #95 = NameAndType        #48:#45       // getOperateContent:()Ljava/lang/String;
   #96 = NameAndType        #49:#45       // getCreateTime:()Ljava/lang/String;
   #97 = NameAndType        #73:#74       // hashCode:()I
   #98 = Utf8               java/lang/StringBuilder
   #99 = Utf8               SkuOperateLogVo(operator=
  #100 = NameAndType        #108:#109     // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #101 = Utf8               , skuId=
  #102 = NameAndType        #108:#110     // append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
  #103 = Utf8               , operateContent=
  #104 = Utf8               , createTime=
  #105 = Utf8               )
  #106 = NameAndType        #82:#45       // toString:()Ljava/lang/String;
  #107 = Utf8               java/lang/Object
  #108 = Utf8               append
  #109 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #110 = Utf8               (Ljava/lang/Object;)Ljava/lang/StringBuilder;
{
  public com.imall.s2c.log.vo.SkuOperateLogVo();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 8: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;

  public java.lang.String getOperator();
    descriptor: ()Ljava/lang/String;
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: getfield      #2                  // Field operator:Ljava/lang/String;
         4: areturn
      LineNumberTable:
        line 13: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;

  public java.lang.Long getSkuId();
    descriptor: ()Ljava/lang/Long;
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: getfield      #3                  // Field skuId:Ljava/lang/Long;
         4: areturn
      LineNumberTable:
        line 16: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;

  public java.lang.String getOperateContent();
    descriptor: ()Ljava/lang/String;
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: getfield      #4                  // Field operateContent:Ljava/lang/String;
         4: areturn
      LineNumberTable:
        line 19: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;

  public java.lang.String getCreateTime();
    descriptor: ()Ljava/lang/String;
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: getfield      #5                  // Field createTime:Ljava/lang/String;
         4: areturn
      LineNumberTable:
        line 22: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;

  public void setOperator(java.lang.String);
    descriptor: (Ljava/lang/String;)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: aload_1
         2: putfield      #2                  // Field operator:Ljava/lang/String;
         5: return
      LineNumberTable:
        line 8: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;
            0       6     1 operator   Ljava/lang/String;

  public void setSkuId(java.lang.Long);
    descriptor: (Ljava/lang/Long;)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: aload_1
         2: putfield      #3                  // Field skuId:Ljava/lang/Long;
         5: return
      LineNumberTable:
        line 8: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;
            0       6     1 skuId   Ljava/lang/Long;

  public void setOperateContent(java.lang.String);
    descriptor: (Ljava/lang/String;)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: aload_1
         2: putfield      #4                  // Field operateContent:Ljava/lang/String;
         5: return
      LineNumberTable:
        line 8: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;
            0       6     1 operateContent   Ljava/lang/String;

  public void setCreateTime(java.lang.String);
    descriptor: (Ljava/lang/String;)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: aload_1
         2: putfield      #5                  // Field createTime:Ljava/lang/String;
         5: return
      LineNumberTable:
        line 8: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;
            0       6     1 createTime   Ljava/lang/String;

  public boolean equals(java.lang.Object);
    descriptor: (Ljava/lang/Object;)Z
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=11, args_size=2
         0: aload_1
         1: aload_0
         2: if_acmpne     7
         5: iconst_1
         6: ireturn
         7: aload_1
         8: instanceof    #6                  // class com/imall/s2c/log/vo/SkuOperateLogVo
        11: ifne          16
        14: iconst_0
        15: ireturn
        16: aload_1
        17: checkcast     #6                  // class com/imall/s2c/log/vo/SkuOperateLogVo
        20: astore_2
        21: aload_2
        22: aload_0
        23: invokevirtual #7                  // Method canEqual:(Ljava/lang/Object;)Z
        26: ifne          31
        29: iconst_0
        30: ireturn
        31: aload_0
        32: invokevirtual #8                  // Method getOperator:()Ljava/lang/String;
        35: astore_3
        36: aload_2
        37: invokevirtual #8                  // Method getOperator:()Ljava/lang/String;
        40: astore        4
        42: aload_3
        43: ifnonnull     54
        46: aload         4
        48: ifnull        65
        51: goto          63
        54: aload_3
        55: aload         4
        57: invokevirtual #9                  // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
        60: ifne          65
        63: iconst_0
        64: ireturn
        65: aload_0
        66: invokevirtual #10                 // Method getSkuId:()Ljava/lang/Long;
        69: astore        5
        71: aload_2
        72: invokevirtual #10                 // Method getSkuId:()Ljava/lang/Long;
        75: astore        6
        77: aload         5
        79: ifnonnull     90
        82: aload         6
        84: ifnull        102
        87: goto          100
        90: aload         5
        92: aload         6
        94: invokevirtual #9                  // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
        97: ifne          102
       100: iconst_0
       101: ireturn
       102: aload_0
       103: invokevirtual #11                 // Method getOperateContent:()Ljava/lang/String;
       106: astore        7
       108: aload_2
       109: invokevirtual #11                 // Method getOperateContent:()Ljava/lang/String;
       112: astore        8
       114: aload         7
       116: ifnonnull     127
       119: aload         8
       121: ifnull        139
       124: goto          137
       127: aload         7
       129: aload         8
       131: invokevirtual #9                  // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       134: ifne          139
       137: iconst_0
       138: ireturn
       139: aload_0
       140: invokevirtual #12                 // Method getCreateTime:()Ljava/lang/String;
       143: astore        9
       145: aload_2
       146: invokevirtual #12                 // Method getCreateTime:()Ljava/lang/String;
       149: astore        10
       151: aload         9
       153: ifnonnull     164
       156: aload         10
       158: ifnull        176
       161: goto          174
       164: aload         9
       166: aload         10
       168: invokevirtual #9                  // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       171: ifne          176
       174: iconst_0
       175: ireturn
       176: iconst_1
       177: ireturn
      LineNumberTable:
        line 8: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0     178     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;
            0     178     1     o   Ljava/lang/Object;
           21     157     2 other   Lcom/imall/s2c/log/vo/SkuOperateLogVo;
           36     142     3 this$operator   Ljava/lang/Object;
           42     136     4 other$operator   Ljava/lang/Object;
           71     107     5 this$skuId   Ljava/lang/Object;
           77     101     6 other$skuId   Ljava/lang/Object;
          108      70     7 this$operateContent   Ljava/lang/Object;
          114      64     8 other$operateContent   Ljava/lang/Object;
          145      33     9 this$createTime   Ljava/lang/Object;
          151      27    10 other$createTime   Ljava/lang/Object;
      StackMapTable: number_of_entries = 15
        frame_type = 7 /* same */
        frame_type = 8 /* same */
        frame_type = 252 /* append */
          offset_delta = 14
          locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo ]
        frame_type = 253 /* append */
          offset_delta = 22
          locals = [ class java/lang/Object, class java/lang/Object ]
        frame_type = 8 /* same */
        frame_type = 1 /* same */
        frame_type = 253 /* append */
          offset_delta = 24
          locals = [ class java/lang/Object, class java/lang/Object ]
        frame_type = 9 /* same */
        frame_type = 1 /* same */
        frame_type = 253 /* append */
          offset_delta = 24
          locals = [ class java/lang/Object, class java/lang/Object ]
        frame_type = 9 /* same */
        frame_type = 1 /* same */
        frame_type = 253 /* append */
          offset_delta = 24
          locals = [ class java/lang/Object, class java/lang/Object ]
        frame_type = 9 /* same */
        frame_type = 1 /* same */

  protected boolean canEqual(java.lang.Object);
    descriptor: (Ljava/lang/Object;)Z
    flags: ACC_PROTECTED
    Code:
      stack=1, locals=2, args_size=2
         0: aload_1
         1: instanceof    #6                  // class com/imall/s2c/log/vo/SkuOperateLogVo
         4: ireturn
      LineNumberTable:
        line 8: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;
            0       5     1 other   Ljava/lang/Object;

  public int hashCode();
    descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=7, args_size=1
         0: bipush        59
         2: istore_1
         3: iconst_1
         4: istore_2
         5: aload_0
         6: invokevirtual #8                  // Method getOperator:()Ljava/lang/String;
         9: astore_3
        10: iload_2
        11: bipush        59
        13: imul
        14: aload_3
        15: ifnonnull     23
        18: bipush        43
        20: goto          27
        23: aload_3
        24: invokevirtual #13                 // Method java/lang/Object.hashCode:()I
        27: iadd
        28: istore_2
        29: aload_0
        30: invokevirtual #10                 // Method getSkuId:()Ljava/lang/Long;
        33: astore        4
        35: iload_2
        36: bipush        59
        38: imul
        39: aload         4
        41: ifnonnull     49
        44: bipush        43
        46: goto          54
        49: aload         4
        51: invokevirtual #13                 // Method java/lang/Object.hashCode:()I
        54: iadd
        55: istore_2
        56: aload_0
        57: invokevirtual #11                 // Method getOperateContent:()Ljava/lang/String;
        60: astore        5
        62: iload_2
        63: bipush        59
        65: imul
        66: aload         5
        68: ifnonnull     76
        71: bipush        43
        73: goto          81
        76: aload         5
        78: invokevirtual #13                 // Method java/lang/Object.hashCode:()I
        81: iadd
        82: istore_2
        83: aload_0
        84: invokevirtual #12                 // Method getCreateTime:()Ljava/lang/String;
        87: astore        6
        89: iload_2
        90: bipush        59
        92: imul
        93: aload         6
        95: ifnonnull     103
        98: bipush        43
       100: goto          108
       103: aload         6
       105: invokevirtual #13                 // Method java/lang/Object.hashCode:()I
       108: iadd
       109: istore_2
       110: iload_2
       111: ireturn
      LineNumberTable:
        line 8: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0     112     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;
            3     109     1 PRIME   I
            5     107     2 result   I
           10     102     3 $operator   Ljava/lang/Object;
           35      77     4 $skuId   Ljava/lang/Object;
           62      50     5 $operateContent   Ljava/lang/Object;
           89      23     6 $createTime   Ljava/lang/Object;
      StackMapTable: number_of_entries = 8
        frame_type = 255 /* full_frame */
          offset_delta = 23
          locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object ]
          stack = [ int ]
        frame_type = 255 /* full_frame */
          offset_delta = 3
          locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object ]
          stack = [ int, int ]
        frame_type = 255 /* full_frame */
          offset_delta = 21
          locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object, class java
/lang/Object ]
          stack = [ int ]
        frame_type = 255 /* full_frame */
          offset_delta = 4
          locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object, class java
/lang/Object ]
          stack = [ int, int ]
        frame_type = 255 /* full_frame */
          offset_delta = 21
          locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object, class java
/lang/Object, class java/lang/Object ]
          stack = [ int ]
        frame_type = 255 /* full_frame */
          offset_delta = 4
          locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object, class java
/lang/Object, class java/lang/Object ]
          stack = [ int, int ]
        frame_type = 255 /* full_frame */
          offset_delta = 21
          locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object, class java
/lang/Object, class java/lang/Object, class java/lang/Object ]
          stack = [ int ]
        frame_type = 255 /* full_frame */
          offset_delta = 4
          locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object, class java
/lang/Object, class java/lang/Object, class java/lang/Object ]
          stack = [ int, int ]

  public java.lang.String toString();
    descriptor: ()Ljava/lang/String;
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: new           #14                 // class java/lang/StringBuilder
         3: dup
         4: invokespecial #15                 // Method java/lang/StringBuilder."<init>":()V
         7: ldc           #16                 // String SkuOperateLogVo(operator=
         9: invokevirtual #17                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj
ava/lang/StringBuilder;
        12: aload_0
        13: invokevirtual #8                  // Method getOperator:()Ljava/lang/String;
        16: invokevirtual #17                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj
ava/lang/StringBuilder;
        19: ldc           #18                 // String , skuId=
        21: invokevirtual #17                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj
ava/lang/StringBuilder;
        24: aload_0
        25: invokevirtual #10                 // Method getSkuId:()Ljava/lang/Long;
        28: invokevirtual #19                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Lj
ava/lang/StringBuilder;
        31: ldc           #20                 // String , operateContent=
        33: invokevirtual #17                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj
ava/lang/StringBuilder;
        36: aload_0
        37: invokevirtual #11                 // Method getOperateContent:()Ljava/lang/String;
        40: invokevirtual #17                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj
ava/lang/StringBuilder;
        43: ldc           #21                 // String , createTime=
        45: invokevirtual #17                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj
ava/lang/StringBuilder;
        48: aload_0
        49: invokevirtual #12                 // Method getCreateTime:()Ljava/lang/String;
        52: invokevirtual #17                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj
ava/lang/StringBuilder;
        55: ldc           #22                 // String )
        57: invokevirtual #17                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj
ava/lang/StringBuilder;
        60: invokevirtual #23                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;

        63: areturn
      LineNumberTable:
        line 9: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      64     0  this   Lcom/imall/s2c/log/vo/SkuOperateLogVo;
}
SourceFile: "SkuOperateLogVo.java"
View Code

1.1、字面量(指由字母和数字等构成的字符串或数值常量,也就是=右边的值,如下面的1, 2,"abcdefg")

int a = 1;
int b = 2;
int c = "abcdefg";

1.2、符号引用(相对于直接引用来说)

  主要包含三种情况:a、类和接口的全限定名。b、字段的名称和描述。c、方法的名称和描述。如上面的a、b、c就是字段名称,还有SkuOperateLogVo类常量池里的 Lcom/imall/s2c/log/vo/SkuOperateLogVo 是类的全限定名,getOperator等是方法名,()是UTF8格式的描述符,这些都是符号引用。

2、运行时常量池

  class常量池目前是静态信息,只有运行时被加载到内存中,这些符号引用才会转换为代码对应的内存地址。class常量池一旦被加载到内存中就变为了运行时常量池,对应的符号引用在程序加载或运行时会被转换为被加载到内存区域的代码的直接引用,也就是我们说的动态链接。例如,compute()这个符号引用在运行时就会被转变为compute()方法具体代码在内存中的 地址,主要通过对象头里的类型指针去转换直接引用。

3、字符串常量池

  jdk7,8版本中,字符串常量池在堆中。

       //在常量池创建abcdefg
        String a = "abcdefg";
        //先在常量池判断abcdefg是否存在,不存在创建,存在不操作,再在堆中创建abcdefg对象
        String b = new String("abcdefg");
        //判断abcdefg在常量池中是否存在,存在则引用,不存在则在常量池中创建指向堆中的指针
        String c = b.intern();
        //先判断常量池中是否存在abcdefg1,不存在创建,存在不操作,再在堆中创建abcdefg1
        String b1 = new String("abcdefg1");
        //先判断abcdefg1在常量池中是否存在,存在则引用,不存在则在常量池中创建指向堆中的指针
        String c1 = b1.intern();
        //存在变量,编译期间无法执行,使用jclass发现使用了StringBuilder
        String d = a+"hi";
        //先判断常量池中是否存在,不存在则创建,存在则引用
        String e = "abcdefghi";
        //先判断常量池中是否存在,不存在则创建,存在不操作,再在对中创建java对象
        String f = new String("java");
        //先判断常量池中是否存在,存在则引用,不存在则创建指向堆中字符串的指针
        String g = f.intern();
        //先判断常量池中是否存在,不存在则创建,存在则引用
        String h = "java";
        System.out.println( a==b);//false
        System.out.println( b==c);//false
        System.out.println( b1==c1);//false
        System.out.println( a==c);//true
        System.out.println( d==e);//false
        System.out.println( f==g);//false
        System.out.println( h==g);//true

选中类,在view中执行show bytecode with jclasslib

4、8种基本类型的包装类和对象池

java中基本类型的包装类大部分都包含了常量池技术(对象池),这些类是Byte,Short,Integer,Long,Character,Boolean,其余两种浮点类型则没有实现,另外Byte,Short,Integer,Long,Character这5种,只有在值大于-128并小于127时,才会使用对象池。

        //通过jclasslib发现使用了invokestatic #2 <java/lang/Integer.valueOf>
     Integer a = 127; Integer b = 127; Integer c = 128; Integer d = 128; Integer e = -129; Integer f = -129; Integer g = -128; Integer h = -128; //new不会使用对象池 Integer i = new Integer(127); Integer j = new Integer(127); System.out.println(a==b);//true System.out.println(c==d);//false System.out.println(e==f);//false System.out.println(g==h);//true System.out.println(i==j);//false

 valueof方法会优先使用Integer数组中的数据

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

 

posted @ 2023-04-12 11:03  西风51668  阅读(3)  评论(0)    收藏  举报