对于常量池而言,字符串的概念较为广泛,并不单指字符串变量。类名、方法名、类型、this指针名,等等,都可以看作是字符串,最终都会被JVM当作字符串处理、存储到符号区。
由于无论是tag还是constantPool的数据区,一个存储位置只能存放一个指针宽度的数据,而字符串往往很大,因此JVM专门设计一个“符合表”的内存区,tag和constantPool数据区内仅保存指针指向符号区。
JVM对字符串的处理如下:
以上代码给出了一个基本思路,即字节码文件中的字符串常量池元素最终都会被保存到符号表中,为了节省内存,JVM会先判断符号表中是否存在相同的字符串,如果已经存在,则不会申请内存。这就是如果你在一个类中定义了两个字符串,但是这两个字符串的值相同,最终这两个字符串变量都会同时指向常量池中同一个位置的原因。
网友评论