dingjs
dingjs
周老师,你好,感谢回复。 `Run-time Contant Pool`的官方定义中明确表述为: > A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool table in a class file (§4.4). 翻译为中文为 > 运行时常量池是class file中每个类或接口的常量池表(constant_pool table)的运行时表示方式。...
周老师,字符串常量池已经不在方法区了,我这个表述确实不恰当。 jvms和jls都只规定了 1. 同样的字符串字面量指向的是同一个对象 2. 调用string.intern与对应的字符串字面量指向的也是同一个对象 通篇并没有说字符串常量池,字符串常量池只是jvm的具体实现满足jvm对于字符串相关规定的解决方案。您在回贴中也有提到。您回贴中的表述我都认可,除了**字符串常量池是运行时常量池的子集**这个表述。 我反复看了几遍[jvms11-5.1章节](https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-5.html#jvms-5.1)关于运行时常量池的描述,原文重点内容引用如下 1. There are **two kinds of entry** in the run-time constant pool: **symbolic references**, which may later be resolved (§5.4.3), and **static...
> 字面量(String Literal)以CONSTANT_String_info结构存储在运行时常量池中。 周老师,这句话我认可。 但 字符串常量池就是虚拟机中存储字面量的集合 这句话不认可。 String str = "abc"; "abc"是字面量,这个字面量是啥,我在上一回复中有说明。 String str = String.valueOf(6666666).intern() 这里没有字面量,会生成一个string对象,放在字符串常量池中。 我感觉咱俩的主要分歧在于`字符串常量池`的定义上了。 我的理解如下: 在jvms中,没有定义`字符串常量池`,只是具体jvm实现为了满足规范要求的一种实现。字符串常量池是jvm具体实现(如HotSpot)中用于存放字符串实例对象的地方,是一个定长的hashtable,可用StringTableSize来配置其大小。 String str = "abc"; 这个“abc”的字面量以以CONSTANT_String_info结构存储在运行时常量池中,jvm把这个字面量解析为一个string对象的引用。恕我再贴一下原文 1. There are **two kinds...
JLS对于String Literal明确定义如下: A string literal is a reference to an instance of class String (§4.3.1, §4.3.3). Moreover, a string literal always refers to the same instance of class String. 一个字面量是一个String对象实例的引用,而且相同的字面量指向的是同一个实例。...
周老师,constant pool与runtime constant pool之间的关系如下: > A class file keeps all its symbolic references in one place, the constant pool. Each class file has a constant pool, and each class or...
周老师,与之交流,收益颇多。 1. [symbolTable.cpp](https://github.com/JetBrains/jdk8u_hotspot/blob/c39701c890a5960dfa7c325b78ee97085646f57d/src/share/vm/classfile/symbolTable.cpp)是因我看的非官方源码,而是jetBrains的,这个版本中StringTable在symbolTable.cpp中。但确实不不该引用非官方源码。 2. 至于拿HotSpot的代码来解释虚拟机规范的定义,确实逻辑上存在瑕疵,但也是不得已而为之,因为字符串常量池并非jvms中的定义,String.intern操作的是stringTable,而非运行时常量池contantPool 3. `String s = “6666666”` 与 `String s= String.valueOf(666666).intern()`都会往字符串常量池里存放(注:此表述又隐含了具体jvm实现)。前文**多次引用**的JVMS中对于`static constant`的解析时也提到,JVM在解析constant pool表生成runtime constant pool时,如果相同字符串之前已调用intern,则返回该对象实例的引用,否则创建一个新对象,最后在新对象上调用intern. 4. jvm在parse classfile,生成运行时常量池时,按照规范是会调用stirng.intern.您最后的问题,我的回答是运行时常量池中存的是字符串实例的引用 ![image](https://user-images.githubusercontent.com/3361218/117100024-3aa47e80-ada5-11eb-91cf-0d4c20c0b03b.png) 5. jvm在解析classfile生成运行时常量池时用到了String.intern,无法推导出string.intern操作的就是运行时常量池。这两逻辑不对等。字符串常量池并不是运行时常量池的一部分。
> > [提问的智慧中国版](https://mp.weixin.qq.com/s/q461so9lWk4FKJGZ-p7Vcg) > > `Eric S. Raymond` 在2004年发表过一篇 `How To Ask Questions The Smart Way` 文章,最新版是2014年的3.10版,原文网址: **http://www.catb.org/~esr/faqs/smart-questions.html** 。 这篇文章写的非常好,我深受启发。然**原文过于冗长**,有很多信息也已经过时;网上的 中文版大多是照搬翻译,语感不佳,有浓厚的译制片配音的语调和翻译错误(如 `honest mistake` 翻译为 `坦诚的错误`)。且文章是站在国外程序员的视角写的,与中国特色社会主义程序员不符。为了更好的宣扬`提问的智慧`,于是我对原文做了大量的删减和本土化改造,更贴近中国程序员的实际情况。 > > 感谢,对开源社区很有帮助👍🏻 感谢认可,你在 github...