黑马JVM总结(六)

(1)常量池

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

黑马JVM总结(六)_第1张图片

 反编译二进制字节码: 

黑马JVM总结(六)_第2张图片

类的基本信息:

黑马JVM总结(六)_第3张图片

常量池:

黑马JVM总结(六)_第4张图片

方法定义:

构造方法

黑马JVM总结(六)_第5张图片

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

黑马JVM总结(六)_第6张图片

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

黑马JVM总结(六)_第7张图片 黑马JVM总结(六)_第8张图片

ldc:

黑马JVM总结(六)_第9张图片 黑马JVM总结(六)_第10张图片

invokevirtual  #4:

黑马JVM总结(六)_第11张图片 黑马JVM总结(六)_第12张图片

黑马JVM总结(六)_第13张图片

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

(2)运行时常量池

黑马JVM总结(六)_第14张图片

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

(3)StringTable_面试题

StringTable是我们常说的串池

黑马JVM总结(六)_第15张图片

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

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

黑马JVM总结(六)_第16张图片

黑马JVM总结(六)_第17张图片

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

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

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

黑马JVM总结(六)_第18张图片

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

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

黑马JVM总结(六)_第19张图片

(5)StringTable_字符串变量拼接

黑马JVM总结(六)_第20张图片

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

#5:创建StringBuild对象

#6:调用StringBuild的无参构造

aload1:是把参数s1加载进来

#7:调用StringBuild的append方法

#8:调用StringBuild对的toString方法

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

黑马JVM总结(六)_第21张图片

黑马JVM总结(六)_第22张图片

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

黑马JVM总结(六)_第23张图片

你可能感兴趣的:(JVM虚拟机,jvm)