《深入理解Java虚拟机》第2版挖的坑终于在第4版中被R大填平了 (下)

简介: 《深入理解Java虚拟机》第2版挖的坑终于在第4版中被R大填平了 (下)

我们可以看到sum.misc.Version里面的launcher_name字段的值就是“java”:


而根据R大的回答,我们可以找到java.lang.System类:


根据System类的注释我们可以知道,它是由虚拟机自动调用的。而其initializeSystemClass方法会调用sun.misc.Version.init()方法。


到此就真相大白了。


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


可以在心里在默默的复习一下类加载的过程:加载、验证、准备、解析和初始化这五个阶段哦。


另外书中给出的示例代码也有一定的局限性,R大是这样说的:


其实这事情很简单:首先,这个行为必然是要针对某个具体的JDK/JRE实现来讨论的,因为Java语言规范/JVM规范/Java SE标准库的JavaDoc(也是Java SE平台规范的一部分)都没有、也不会强制指定哪个类里一定要引用“java”这个字符串常量,而且它必须是第一个使得“java”被intern的类 --- 规定这个也太无聊了。


比如这个示例我在JDK8u212-b03上跑出来,就是两个true:


在这个版本里面,sun.misc.Version的launcher_name变成了“openjdk”:


那么根据我们之前的猜测,把程序成下面这样的,效果就是一样的了:


万变不离其宗,现在你知道为什么这里用openjdk返回也是false了吧。

知其然,还要知其所以然。


R大与周志明之间的“爱恨情仇”


R大是谁?


我先上一张《深入理解java虚拟机(第二版)》背面的一张图吧,R大给这本书写过推荐语:


莫枢(RednaxelaFx)Oracle HotSpot VM编译器团队工程师。(现在他已经不在Oracle了。据网上公开资料,R大是前阿里巴巴技术专家,前Oracle JVM核心开发,前Azul核心开发,现就职于Databricks)


再看一下他的知乎主页:https://www.zhihu.com/people/rednaxelafx/answers


你去知乎上只搜RednaxelaFX(甚至直接用搜索引擎搜索),就能搜到很多结果,我随便截取一个片段。


在【有哪些顶级水平的中国程序员?】这个话题下,有一个回答只是@一下R大的ID,没有多说一个字,就获得了258个赞,评论中也满是赞美的语言,干货多,就是他的特点:


他与《深入理解Java虚拟机》的作者周志明大大,在2010年到2011年间,在iteye上已经有过多次深度交流,比如下面的吐槽:


比如下面的调侃:


玩归玩,闹归闹,周志明也直言阅读了R大的很多文章,受益良多:


并且在书里的致谢章节专门谢谢了R大:


说这么多,我想要表达的观点其实就是一个:


R大是一个宝藏啊,他乐于分享和交流,凭借一己之力推动了国内jvm的学习和研究,如果你想要了解虚拟机、编译原理和编程语言方面的相关知识,他是一个你绕不过的人。他值得被更多的程序员知道。


如果你之前不知道,但看了我这篇文章后知道了他,我的目的就达到了。


他在知乎上认认真真码字,用心的对待每一个回答,他是一个"码"宗强者,恐怖如斯,但是从他的各种回答、博客文章中,你可以感觉到谦逊、细致、系统、耐心、专业、严谨.....就像一个评论说的:


在技术圈日益浮躁的今天,感觉他就是主席所说的那种:一个纯粹的人,一个有道德的人,一个脱离了低级趣味的人,一个有益于人民的人。

我们做程序的,要向他学习,向他致敬。


最后再附上一个R大的资料合集链接吧,全是宝藏,待你去发掘:

https://zhuanlan.zhihu.com/p/25042028


最后说一句


才疏学浅,难免会有纰漏,如果你发现了错误的地方,还请你留言给我指出来,我对其加以修改。


如果你觉得文章还不错,你的转发、分享、点赞、留言就是对我最大的鼓励。


感谢您的阅读,我坚持原创,十分欢迎并感谢您的关注。


以上。


欢迎关注公众号【why技术】,坚持输出原创。分享技术、品味生活,愿你我共同进步。

目录
相关文章
|
2月前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
5月前
|
存储 算法 安全
Java面试题:Java内存模型及相关知识点深度解析,Java虚拟机的内存结构及各部分作用,详解Java的垃圾回收机制,谈谈你对Java内存溢出(OutOfMemoryError)的理解?
Java面试题:Java内存模型及相关知识点深度解析,Java虚拟机的内存结构及各部分作用,详解Java的垃圾回收机制,谈谈你对Java内存溢出(OutOfMemoryError)的理解?
75 0
|
3月前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
122 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
4月前
|
Java
Java常见JVM虚拟机指令(47个)
Java常见JVM虚拟机指令(47个)
73 3
Java常见JVM虚拟机指令(47个)
|
5月前
|
监控 Oracle Java
(一)JVM成神路之初识虚拟机 - 探寻Java虚拟机的前世今生之秘
JVM(Java Virtual Machine)Java虚拟机的概念大家都不陌生,Java之所以可以做到“一次编译,到处运行”的跨平台性,其根本原因就在于JVM。JVM是建立在操作系统(OS)之上的,Java虚拟机屏蔽了开发人员与操作系统的直接接触,我们在通过Java编写程序时,只需要负责编写Java代码即可,关于具体的执行则会由JVM加载字节码后翻译成机械指令交给OS执行。
|
4月前
|
Java 数据安全/隐私保护 Windows
【Azure Developer】使用Java代码启动Azure VM(虚拟机)
【Azure Developer】使用Java代码启动Azure VM(虚拟机)
|
4月前
|
存储 Java API
【Azure Developer】通过Azure提供的Azue Java JDK 查询虚拟机的CPU使用率和内存使用率
【Azure Developer】通过Azure提供的Azue Java JDK 查询虚拟机的CPU使用率和内存使用率
|
5月前
|
存储 Ubuntu Java
【Linux】已解决:Ubuntu虚拟机安装Java/JDK
【Linux】已解决:Ubuntu虚拟机安装Java/JDK
178 1
|
5月前
|
监控 算法 Java
深入理解Java虚拟机:内存管理与性能优化
在Java的世界里,虚拟机(JVM)是幕后的守护者,它默默地支撑着每一个字节码的运行。本文将揭开JVM的神秘面纱,探讨其内存管理机制及如何通过调优提升应用性能。从堆内存的分配到垃圾回收的策略,再到实践中的性能监控与调优技巧,我们将一同走进JVM的内部世界,学习如何让我们的Java程序跑得更快、更稳。
|
5月前
|
Java
Java演进问题之单个虚拟机的最大线程数量一般会设置到200至400条如何解决
Java演进问题之单个虚拟机的最大线程数量一般会设置到200至400条如何解决