查看原文
其他

无责任书评:每个Java程序员都应该深入理解Java虚拟机!

码农翻身刘欣 码农翻身 2021-04-20

Java这门语言的发展是很有意思的,它不像Python, Ruby 等完全是开源社区驱动,也不像C#,VB.NET主要由微软操刀。它是一个以Oracle(之前是Sun)为主,各大巨头一起参与,一起制定标准的一门语言。


想对Java添加一点特性, 得走JCP流程,巨头们要审查,看看对自己是否有利,然后投票决定。


在Java的生态中,  官方曾经制定了很多技术和标准,什么Applet, JSP, EJB,JSF, JavaFX......  但是大部分都被淘汰了,原因很简单,这些标准制定的周期很长, 难以跟上软件行业迅速的变化,等到各大厂商再把实现给搞定,黄花菜都凉了。 所以大家最常用的反而是开源的框架和工具如Spring。


但是Java 语言本身和Java虚拟机是个例外,因为他们不需要也不可能像应用层那样剧烈变化,所以作为后端程序员,对他们进行“投资”是最划算的


所以我们今天就来聊聊Java虚拟机的书籍。写这方面的书很多, 比如我最早看的就是这一本。


我个人认为这是相当不错的一本书,它在讲ClassLoader 的时候举了一个例子,如果没有双亲委托模型,不怀好意的那些java class 很容易会破坏你的系统,这个例子让我印象如此深刻,以至于我在写《我是一个Java Class》的时候,也编了一个类似的例子。


这本书还花了大量的篇幅讲解Java Class的文件格式,整数运算,浮点数运算,数组和数组,异常,方法调用等各种实现细节。


相比而言,周志明的那本书就讲得比较少。


更好玩的是,这本书还附带了一个小程序,能够可视化地、一步步地执行字节码。如果你要想自己写个Java虚拟机,可以关注这本书。 



这本书美中不足的就是年代比较久远,另外翻译得不太好。


然后我们就要说说周志明的这本神书了 《深入理解Java虚拟机》, 是很多Java程序员的案头必备。


第一版是2011年出版, 然后每次京东和当当搞活动,我发现这本书总是站在前排,足以说明其经典地位。嗯,希望我的书《码农翻身》也能有这样的效果。


这本书体现了周志明的深厚功力,把JVM的很多知识讲得深入浅出,有很多也是面试之必备。例如Java虚拟机的运行时数据区域,对象的内存布局,垃圾回收算法,性能调优,代码优化,Java内存模型等等。 


其中的很多内容被博客文章大量抄袭,与其在网上搜了搜去看二手货,还不如直接看书。


在讲理论之外,还举了很多实践中的案例,我印象最深刻的就是那个自己动手实现远程执行功能。


如果说有瑕疵的话,我觉得在讲锁优化,轻量级锁,偏向锁,重量级锁的时候不清楚,让人看起来云里雾里。 不妨先看看我的文章《我也是一个线程,为什么不让我阻塞休息呢?


但是,我必须要说的是:如果刚刚学会Java, 会用Java 框架开发项目,立刻就来看这本书,就需要小心了。 


第一章、第二章估计还不错,到了第三章“垃圾回收器和内存分配”就会开始犯晕, 坚持到第四章“性能监控和故障处理” 和第五章“调优案例分析和实战”, 估计就看不行去了, 因为比较枯燥,再加上缺乏经验,在工作中实际应用得比较少。


这时候可以跳过他们, 直接去看第六、七、八、九章,看看类的文件结构,加载机制,执行引擎 ,都是很有意思的内容。


至于第十章,第十一章,也是比较枯燥,和实战结合不紧密的部分,也可以跳过,事后慢慢再看。


第十二章,第十三章讲Java内存模式、线程安全、锁,要重点看一下。


总之,这本书可以放到案头,遇到问题时不时地翻一下,总是会有收获。


不知道你看完了Java虚拟机的书籍以后有没有这样的念头:自己动手也来写一个!


其实很多人已经动手做了,并且用了不同的语言来实现,比如《自己动手写java 虚拟机》一书中用Go语言做了实现。 


GitHub上有人用C语言实现: 

https://github.com/ozy/ToyJVM/


还有用Python实现的: 

https://github.com/gkbrk/python-jvm-interpreter


我在编程提高群第一季中还带着大家用Java做了一个实现。 


但是不得不说,这些实现都不是完整的虚拟机,至少都没有实现垃圾回收功能,但是通过写一个简单的虚拟机,你会更加深入地理解Class 文件的字节码,理解JVM运行时的结构,理解函数调用如何实现,多态如何实现。 


经常抱怨增删改查没技术含量的同学可以尝试下,写个虚拟机需要驾驭多个类的设计,这是一个不小的工程,很有价值。


你可能会喜欢

关于老刘和码农翻身

为什么《深入理解计算机系统》是一本神书?

我是一个线程

我是一个Java Class

面向对象圣经

TCP/IP之大明邮差

CPU阿甘

负载均衡的原理

一个故事讲完HTTPs

编程语言的巅峰

Java:一个帝国的诞生

JavaScript:一个屌丝的逆袭

C语言:春节回家,我发现只有我没有对象

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存