《深入理解Java虚拟机》第二版 中的关于intern()的一个坑

深入理解Java虚拟机》第二版 中的关于intern()的一个坑
详细的可以看《深入理解Java虚拟机》第2版挖的坑终于在第3版中被R大填平了

其实本不必再写一篇,不过这个坑也确实疑惑我了,多写一篇 让更多的人看到

《深入理解Java虚拟机》第二版 中的关于intern()的一个坑
你倒是告诉我哪里出现过嘛!!!!!!!!!!!!!

在第三版上已经对此问题说明了。
是在sum.misc.Version里面的launcher_name字段的值就是“java”:
《深入理解Java虚拟机》第二版 中的关于intern()的一个坑

《深入理解Java虚拟机》第二版 中的关于intern()的一个坑
到此就真相大白了。

Java标准库在JVM启动过程中会调用sun.misc.Version的init()方法。所以sun.misc.Version会进行类加载的操作,而类加载的初始化阶段时,会对静态常量字段进行真正的赋值操作,但是由于sun.misc.Version的launcher_name字段是final修饰的,所以引用的字符串“java”在准备阶段就被intern到了字符串常量池里面了

另外,在OpenJdk JDK8u212-b03中

《深入理解Java虚拟机》第二版 中的关于intern()的一个坑
是因为其改成了
《深入理解Java虚拟机》第二版 中的关于intern()的一个坑
《深入理解Java虚拟机》第二版 中的关于intern()的一个坑

==== 吃井不忘挖水人

@why技术 写文章刨根究底,语言诙谐,配图多,堪称看段子
why技术
@RednaxelaFX是个狠人 向RednaxelaFX致敬
RednaxelaFX