当前位置 博文首页 > 码农翻身:无责任书评:每个Java程序员都应该深入理解Java虚拟机

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

    作者:[db:作者] 时间:2021-07-04 13:00

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

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

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

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

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

    640?wx_fmt=png

    640?wx_fmt=gif

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

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

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

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

    640?wx_fmt=jpeg

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

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

    640?wx_fmt=gif

    640?wx_fmt=png

    第一版是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语言:春节回家,我发现只有我没有对象

    640?wx_fmt=jpeg

    cs