• 黑马JVM总结(六)


    (1)常量池

    方法区的组成中都由一个叫做运行时常量池的部分,内部包含一个叫做StringTable的东西

     反编译二进制字节码: 

    类的基本信息:

    常量池:

    方法定义:

    构造方法

    main方法 :方法中有一些指令,通过指令    #2去常量池中找这个静态指令

    常量池:#2它是要找java/lang/System类下的out变量,类型是java/io/PrintStream

     

    ldc:

     

    invokevirtual  #4:

     

    通过常量池总用:就是给我们这些指令提供一些常量符号根据这个常量符号去一查找的方式去找到它

    (2)运行时常量池

    常量池运行时放到内存里,在内存中的位置叫做运行时常量池

    (3)StringTable_面试题

    StringTable是我们常说的串池

    (4)StringTable_常量池和串池的关系

    反编译:查看常量池 是什么样子:

    astore_1是把a这个常量存到1号的局部变量 

    LocalVariableTable:是main方法栈帧运行时局部变量表

    是main方法栈帧运行时局部变量表的变量s1编号是1

    StringTable [ ]  数据结构上是一个哈希表,长度是固定的,不能扩容的

    当ldc #2 执行这个指令会把a变成字符串对象,同时准别一个空间StringTable[] 串池,把a作为key去StringTable中找有没有这个,没有的话放a对象放入串池

    (5)StringTable_字符串变量拼接

    反编译查看main方法中的指令:

    #5:创建StringBuild对象

    #6:调用StringBuild的无参构造

    aload1:是把参数s1加载进来

    #7:调用StringBuild的append方法

    #8:调用StringBuild对的toString方法

    astore4:是把toString转换后的结果存入4号的局部变量s4中

    StringBuild中toString方法内部是new 了一个String(ab)的对象,s4是存在堆中的,s3是串池中的是两个对象

  • 相关阅读:
    Shell编程之免交互
    openlayer 鼠标点击船舶,打开船舶简单弹框
    【21天学习挑战赛】算法——算法概述
    HCIP VLAN实验
    Tlsr8258开发-b85m_module编译无法通过
    VSCODE 配置远程调试环境
    shell 位置参数变量
    Python入门 —— 从零基础到调包侠
    微服务系列开端-简述
    多表关联怎么进行操作?_(相关搜索:数据库)
  • 原文地址:https://blog.csdn.net/dengfengling999/article/details/132819082