64

学习 Java 虚拟机也许这是最好的方法

 6 years ago
source link: https://mp.weixin.qq.com/s/MPtdlpo7QAasjIOrO-xAIg?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

学习Java虚拟机也许这是最好的方法

Original 侯树成 Tomcat那些事儿 2018-01-09 00:11 Posted on

做 Java 开发的同学,以及其他使用基于 JVM 的编程语言,都或多或少的了解过 JVM 的一些知识,例如类加载器,  class 文件的结构与解析,以及 JVM 指令等内容。

这些内容在了解和学习时,我一般是看一些 JVM 的规范、深入 Java 虚拟机这一类的书籍,以及一些前人总结的优质文章。这些书和文章质量都比较高,但有个问题也很明显:这些内容中都是总结或者结论,比较概括。而对于想从基础开始,或者喜欢从实战入手的朋友,就稍显不适应。

就好比一本武功秘籍写道「四两拨千斤」。我们理解上只能意会到用比较轻的力,撬动了很重的东西。那如果这个时候能有个辅助说明,「向来的力一侧,用三成内力 ...」那就更详细。如果此时再有个手把手的师傅教学一下,那理解则会更快更深刻。

在某本书里看过这样一个例子:

某国际大学里分两组进行陶器制作实验,第一组不允许看书,每天都用土进行器具制作。当然因为没有相关知识,泥软硬控制不好,器具烧裂等。而第二组则从一开始就从基础的理论学起,之后又参观各类制作精良的器具。对于如何制作,他们胸有成竹。

快要结课的时候两个组每个人都需要制作一件器具,哪个组作品做的更好呢?

竟然是第一个组,这种来自真实的经验,通过多次实践,这种「Get hands dirty」的学习方式获胜。

duang!  一个同学扔来砖头。说了这么多,和JVM学习有半毛钱关系么?

别急,这就回到我们的 JVM 学习的话题。比如说解析 class文件, 我们看规范知道哪些位置知道存储的是类与方法签名,以及对应的的修饰符,哪些是常量区的内容。比如我们学习类加载器,看书会了解到BootStrap加载器,App加载器,Ext加载器,这些内容到合上书,还有多少能在我们「制作自己的器具」时能马上浮现在脑海?多少还是有些纸上谈兵。

如果以 Get your hands dirty 的方式,我们自己写一个 超简易的 JVM, 首先加上类加载器功能,这个时候首先需要根据不同的 classpath 进行查找,自然会了解不同的类加载器,同时对于类加载器的双亲委托也会理解的很深刻。 那加载到的 class 文件只是一个 InputStream, 怎样将其转成一个 Class 呢? 就会涉及到class 文件的解析。那这个时候你怎么会不了解「CAFEBABE」呢?

「快别BB了,到底想说啥?」,另一个同学高叫着。

其实是最近在图书馆看到一本书,读了一部分感觉不错,推荐给各位。 也就是荐书

书是这本:

自己动手写Java虚拟机』。

Image

目前我看了前三章,这种通过「造轮子」来了解轮子的知识,个人认为很适合学习。 

有些书评认为此书写的较浅显,实现的JVM也不完整。但我认为,学习这种事情,在书的思路中,每一章是可以扩展的啊。比如在看此书的解析 class 文件章节,是不是可以顺手比对着看下 JVM 规范,顺道看看 ASM/BCEL/Javassist这类操作字节码的工具是怎么工作的,知识一下子就丰富了。

此外,这种「造」的方式学习,比干巴巴的理解要容易的多。而在造出来轮子后,对于整个轮子,不再是一种远观的方式,而是了解其背后的一些原理,在扩展到其他相关主题的内容上时,也好理解的多。

当然,对于一些从事JVM开发,甚至靠啃OpenJDK的源码和规范习得内功的朋友,这种老司机可能不认为这种方式好。所以所谓的最好,其实都是因人而异。欢迎其他老司机们留言发表下你认为最好的学习方式。

Image

怎样阅读源代码?

读源码时,我们到底在读什么?

☆★☆更多精彩内容☆★☆

一台机器上安装多个Tomcat 的原理(回复001)

监控Tomcat中的各种数据 (回复002)

启动Tomcat的安全机制(回复003)

乱码问题的原理及解决方式(回复007)

Tomcat 日志工作原理及配置(回复011)

web.xml 解析实现(回复 012)

线程池的原理( 回复 014)

Tomcat 的集群搭建原理与实现 (回复 015)

类加载器的原理 (回复 016)

类找不到等问题 (回复 017)

代码的热替换实现(回复 018)

Tomcat 进程自动退出问题 (回复 019)

为什么总是返回404? (回复 020)

PS: 对于一些 Tomcat常见问题,在公众号的【常见问题】菜单中,有需要的朋友欢迎关注查看。

觉得本文对你有帮助?请分享给更多人支持一下吧,谢谢

关注『 Tomcat那些事儿 』,发现更多精彩文章!了解各种常见问题背后的原理与答案。深入源码,分析细节,内容原创,欢迎关注。

Image

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK