黑马JVM总结(七)

(1)StringTable_编译器优化

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

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

“a”+“b”对应#4:是去常量池中找ab的这个符号

astore    5:是把这个存入编号为5的局部变量

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

“ab”对应的指令 #4,跟“a”+“b”对应#4下面弄是一样的

在执行s3=“ab”这行个代码时,去常量池中找ab这个对象,发现串池中没有ab这个对象,创建放入串池,执行到s5=“a”+“b”这行代码时,去常量池中找ab这个对象,串池中有了ab这个对象。不会再创建新的对象了,他们的值是相等的

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

所以astore到  3的变量和astore到 5 的变量都是串池中的ab字符串对象

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

(2)StringTable_字符串延迟加载

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

通过IDEA的Memory查看运行时String对象的个数,

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

跳转下一步:黑马JVM总结(七)_第8张图片

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

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

在往下走是上面创建的对象串池中有了不会再创建新的对象啦

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

(3)StringTable_intern_1.8

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

new String("a")+new String("b")  底层调用是StringBuild通过newString("ab")是存放到堆中的

可以通过intern把堆中的对象放到串池中并返回,会返回true

最后串池中已有这个ab,“ab”就不会新建对象了,会返回true

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

如果先有“ab”,下面创建的对象s,调用intern方法是,因为串池中已经有了所以不会把队中的对象再放入串池,而是返回串池中的对象,所以s不等于x 

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

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