1. 《深入理解Java虚拟机》过时了吗?

《深入理解J***a虚拟机》过时了吗?

可以负责任的讲,目前没有过时,未来短期内也不会过时。《深入理解J***a虚拟机》是否过时,首先取决于 J***a 语言本身是否过时了。目前J***a在绝大多数领域占有不可忽视的地位。在语言排行榜中,也是长期居于前列。j***a 本身的可移植性,使得很多服务器以及web后端开发都青睐有加,而其自身语言的特性,以及丰富的库,更让他在众多语言中经久不衰。而作为J***a开发中至关重要的虚拟机,开发者能够多大程度上深入理解它的机制,也是区别优秀的J***a开发者和普通开发者的标杆之一。所以作为J***a的开发者,如果想在技术上有更深入的发展,虚拟机机制是必须要过的一道坎。而《深入理解J***a虚拟机》这本书是相对比较经典的介绍该方面知识的书籍,还是值得推荐的。

本不想来回答这个问题,但看到下面那个J***a高级架构狮,只是直接放出了j***a虚拟机的内存结构图,觉得还是有必要来说下这个问题的。

先谈是不是过时的问题。

g1收集器,G1收集器
(图片来源网络,侵删)

现在我们在国内可以读到的《深入理解J***a虚拟机》应该是它的第2版吧,我没有去查过,有没有更新的版本,大致长这样

它所针对的,主要是JDK7的规范,那么,从JDK7到现在的JDK 12正式发布,应该说JDK已经在各方面,都发生了很大的变化。

考虑到目前在整个业界,甚至连JDK8的规范,其实还普及未久,那么,简单的就以JDK7和JDK8下,关于PermGen空间的事情,来做个例子。

g1收集器,G1收集器
(图片来源网络,侵删)

在《深入理解J***a虚拟机》的2.4.3中,谈到了运行时常量池的溢出,其中给出了一个说明,即:

但估计你照此去理解JDK8及其以后的虚拟机,恐怕要抓瞎,因为,从JDK8开始,已经没有PermGen空间了,取而代之的是Metaspace。

当然,这不是什么大的问题,但也说明实际上,这么多年,JDK也在与时俱进的发展着,所以:

g1收集器,G1收集器
(图片来源网络,侵删)

考虑到大部分人,是要从事实际的开发工作,而不是考古工作,因此花很多时间,学习一个旧的知识结构,恐怕并不非常高效。

那么,这本书能不能读呢?

原因无他,不是因为它不过时,而是因为:

其实这个问题需要客观地看待,我认为只要j***a虚拟机不过时,《深入理解j***a虚拟机》这本书就不会过时。跑在JVM上的编程语言不止j***a一种,JPython,JRuby,Groovy等语言都跑在j***a虚拟机上,存在即合理,只要这些编程语言有人用,j***a虚拟机就不会过时。很多C和C++的程序员吐槽j***a虚拟机的GC机制导致跑在JVM上的编程语言写出来的程序性能差,执行慢的缺点。这点我不予否定,GC在垃圾回收时的确会有较长的停顿时间,但是事物总是具有两面性的,需要客观看待,C追求性能,那么就得牺牲可移植性。而j***a正是在极致性能和跨平台性两者的权衡下选择了后者,而恰恰j***a虚拟机正是j***a跨平台的核心所在,况且,JVM也是随着技术的发展不断演进的,从CMS,G1再到j***a11目前还在试验阶段的ZGC,j***a虚拟机的GC停顿时间也在变得越来越短,官方给出的ZGC的停顿时间不超过10ms,我们在做性能测试的时候ZGC的停顿时间远远到不了10ms,大多数情况下都在一两毫秒之内,况且10ms的停顿对大多数的程序的性能影响都是微乎其微的,相比于以前四五百毫秒的停顿时间,即使是10ms的停顿也算是几何级的突破了,相信未来的JVM性能还会不断地提升的,所以,在未来的很长一段内,j***a虚拟机不但不会过时的,反而会更加流行。再说《深入理解j***a虚拟机》这本书,自出版以来,一直被业界奉为经典之作,也是程序员了解JVM必看的著作,虽然这本书是基于J***aSE7的规范,但是这并不妨碍我们学习JVM.一般底层的核心内容变化的幅度不是很大的。虽然这本书讲到的CMS垃圾收集器目前已放弃维护,官方重点维护G1和ZGC,但是关于原理和思想的东西是永远都不会变的,之所以长期起来被奉为经典,就是因为有其借鉴的价值。所以《深入理解j***a虚拟机》在未来很长一段时间是不会过时的。