《深入理解Java虚拟机》第二版 中的关于intern()的一个坑
详细的可以看《深入理解Java虚拟机》第2版挖的坑终于在第3版中被R大填平了
其实本不必再写一篇,不过这个坑也确实疑惑我了,多写一篇 让更多的人看到

你倒是告诉我哪里出现过嘛!!!!!!!!!!!!!
在第三版上已经对此问题说明了。
是在sum.misc.Version里面的launcher_name字段的值就是“java”:


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

是因为其改成了


==== 吃井不忘挖水人
@why技术 写文章刨根究底,语言诙谐,配图多,堪称看段子
why技术
@RednaxelaFX是个狠人 向RednaxelaFX致敬
RednaxelaFX
本文深入探讨《深入理解Java虚拟机》中关于intern()方法的潜在问题,揭示其在字符串常量池中的行为,并解释了从第二版到第三版的修正过程。通过分析sun.misc.Version类的加载机制,阐明了final修饰符对字符串的影响。
1918

被折叠的 条评论
为什么被折叠?



