《深入理解Java虚拟机》第二版 中的关于intern()的一个坑
《深入理解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