在Java类文件的常量池中,字符串是以CONSTANT_Utf8_info结构存储的。这个结构使用一个16位的无符号整数来记录字符串的长度(以字节为单位)。由于这个长度的限制是65535个字节(即2^16-1),因此当字符串的UTF-8编码后的字节长度超过这个限制时,就会导致编译错误,提示“常量字符串过长”。 5. 提供解决或缓解字符串...
常量池主要用于存放两大类常量:字面量(Literal)和符号引用量(Symbolic References),字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原理方面的概念,包括了如下三种类型的常量: 类和接口的全限定名 字段名称和描述符 方法名称和描述符 方法区中的运行时常量池 运行时常量...
Java中的UTF-8编码的Unicode字符串在常量池中以CONSTANT_Utf8_info类型表,结构如下: u2类型的length的值就表明了这个UTF-8编码字符串长度是多少字节。 所以CONSTANT_Utf8_info型常量对应的最大长度也就是java中UTF-8编码的字符串的长度,顺便提一下Class文件中的方法和字段也是引用CONSTANT_Utf8_info型常量来描述名...
如果在字符串常量池中已经有一个字符串“abc”,那么就只会创建一个“abc”字符串。如果字符串常量池...
所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。也就是说class文件并不直接与机器的操作系统交互,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。 针对不同的系统有不同的jvm实现,有 Linux 版本的 jvm 实现,也有Windows 版本的 jvm 实现,但是同一段代码在编译...
而出现多个答案的关键争议点在「字符串常量池」上,有的说 new 字符串的方式会在常量池创建一个字符串对象,有人说 new 字符串的时候并不会去字符串常量池创建对象,而是在调用intern()方法时,才会去字符串常量池检测并创建字符串。 那我们就先来说说这个「字符串常量池」。
运行时常量池位于jvm的元空间中(java8) 1.3,字符串常量池 字符串常量池底层实现是一个哈希表,可以通过-XX:StringTableSize参数调整大小。字符串常量池中存储的是字符串对象的引用,而字符串本身是在堆上分配的(java中的对象基本都在堆上分配)。运行时常量池初始化的时候,字面量的符号引用的初始化会用...
字段的部分要注意对于源码字段的类型(descriptor_index),是用常量池的字符串来表示,例如private int age;字段,也会在常量池中已utf8的方式存储字段的数据类型,这里是int,存为utf8的字面量是I,String对应的是Ljava.lang.String,所有引用类型都是L加全限定类名。其他的映射关系是:byte->B, char->C, double->...
其中第一个tag也就是上面我们描述的“每一个元素的第一个数据都是U1类型”,当它的值为1时,表示是CONSTANT_utf8_info类型的常量,而第二个length为u2类型,占两个字节,表示UTF-8编译的字符串长度,而第三个bytes为u1类型点一个字节,表示长度为length的UTF-8编译的字符串内容,也就是根据length来读多少个字节就刚...