通过Jvisualvm简单分析一下Java字符串创建

一、有朋友介绍了jdk自带的查看堆的工具Jvisualvm,还有opl语言,这样能让我很好的查看JVM中的字符串的一个存放的物理地址(区分不同的字符串)如下图:

二、.所以我在这里将字符串的创建的我能想到的所有可能性都试一遍,这样就能知道字符创到底创建了几个对象,继而再分析分别是在堆中还是常量池中进行创建的

1.直接创建一个对象,和new一个对象

 我们可以很清楚的看出aa,bb的个数,并且地址相连的可能是在同一位置(常量池?这个建议去看一下其他资料确认,哈哈,我也去看了)

2.如果说是这样创建

 注意这里我查询了bb和cc,这了bb是没有存在于jvm中的,原因是java程序进行操作的时候,java文件转换成class文件时,编译器自动将“bb”+“cc”  编译成了“bbcc”,但是通过引用进行字符串相加,在编译时期编译器并不知道str1是个啥东西,所以就不能优化了

3.明明还有其他想法的,但是好像忘记了?哈哈,下次想到了继续补充,反正写了也是给自己看,方便理解的

以后可能有新的想法了还会继续补充,建议通过字节码文件查看对象创建流程可能会更加的方便

原文地址:https://www.cnblogs.com/xzmxddx/p/12720348.html