首先,我需要说明的一点是这一讲仍旧属于前言这部分中的内容,只是我单独抽取出来了一讲来专门谈谈我们为什么要学习JVM这个问题。
为什么我们要学习JVM呢?其实这个问题的答案在前面我就已经给大家回答过了,但是在这里我觉得还是有必要再来说一下,如果大家觉得我说得有道理,那么就请三连一下吧!
我们为什么要学习JVM,无非是基于以下三个原因。
面试的需要。
我相信这也是大家为什么要看我这套JVM系列教程的原因,像国内的中大厂,比如BATJ(百度/阿里/腾讯/京东)、TMD(头条/美团/滴滴)、PKQ(拼多多/快手/趣头条)等,面试的时候都爱问关于JVM的面试题。
当然,以上这些公司肯定还会在面试的时候问你一些在实际开发中遇到的具体问题,但是这不足以凸显你作为一个中/高级程序员所具有的技能的深度,相反,像JVM,包括一些深层次的算法问题,这才是以上这些公司区分优秀程序员与普通程序员之间的考量点。
总之,如果你有更好的职业诉求的需要,那么JVM都是你必须要掌握的知识点,逃是逃不掉的,因为面试必问!
中/高级程序员的必备技能。
首先,大家要知道一点,就是Java虚拟机给我们提供了很多配置参数,用于满足我们在不同场景下为程序性能调优的一个需要。其实,这也就是说,掌握JVM之后,我们就可以针对自己的项目去最优化其运行参数了。
正是基于这样那样的一些诉求,所以在项目管理和调优方面,我们都得必须掌握JVM。
追求极客的精神。
尽管当前这个社会物欲横流,凡事以追求个人利益为目的,但不排除有些人超脱于世俗之外,心中有更大的世界,因为他们追求的是一种物我两忘的境界,一般我们称这种人为极客,他们这种人是高尚的,是纯粹的,是脱离低级趣味的,是令人敬佩的!
极客就应该有极客的样子,与平常人不同,他们更感兴趣的是JVM里面的垃圾回收算法、JIT(即时编译器)以及底层原理等。应该这么讲,Java虚拟机拥有当前最前沿、最成熟的垃圾回收算法,此外,现在比较流行的高级语言都选择了即时编译器和解释器并行的这种执行方式,不过这得等到讲JIT(即时编译器)的时候再来给大家细说了,而且,在讲解的时候我还会提到一个叫AOT的玩意,我们一般称其为提前编译器。
总之,我希望大家学习JVM的时候,能了解一下其背后的设计决策,今后如果再遇到其他代码托管技术,那么你就能够触类旁通了。除此之外,还希望大家有更高的追求,不要像以上第一个原因那样太功利,倡导大家都应该有追求极客的精神,想问题应长远一点,不要太急功近利,不要以金钱为你追求的最终目标,当你不断地去深挖技术,将技术做到位的时候,其实你会发现不管是金钱也好,还是社会地位也好,你都会自然而然地慢慢拥有。
接下来,大家来看一下下面这张图,从这张图中相信大家应该能看出来我们是想对比Java和C++这两个语言之间的一个区别。
其实,从这张图中,大家也能看出来为什么我们开篇是来讲述内存与垃圾回收的。
作为比较有代表性的高级语言,C语言应该算是诞生的最早了,不过后面陆陆续续又出现了像C++、Java等等这些语言,这其中Java语言的出现还是比较令人振奋的,因为Java语言本身借鉴了C和C++语言的一些优点,摒弃了它们的一些所谓的缺点。
相比C/C++语言来说,Java语言具有如下两个显著优点。
内存动态分配。
相信大家应该早有耳闻,就是Java语言是自动来管理内存的。
垃圾收集技术。
如果我们想要再次利用现有内存的话,那么就必须得做一件事了,这件事我不说相信大家也应该知道,那便是进行垃圾回收,否则的话,那就成一次性内存了,这是我们绝对不希望发生的事情。
另外,我还想说的一点是,虽然垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是垃圾收集也不是万能的,大家可要切记哟!
与之相反的是,对于C/C++程序员来讲,他们还得自己去分配内存,自己去进行垃圾回收。如果技术比较好,自己来做这些事情的话,可能感觉还是非常舒服的,因为管理的非常好的话,其实对内存的使用会变得更加高效,而且还不会出现一些冗余。但是,如果技术水平并不高,那么对内存的管理与使用可能就会变得非常混乱了。
总之,从语言迭代上来讲,自动管理内存是大势所趋。
然而,自动管理内存又会带来另外一个问题,即我们可能就会对JVM内部的内存结构、工作机制不怎么了解了。如果要是在这种不太了解的情况下,继续使用Java语言编写程序,尤其是去搭建一个大型项目并在JVM上运行,那么就会变得非常危险了。因为你都不了解JVM内部的内存结构、工作机制,你怎么去调优!这就像你会骑自行车,但现在把你眼睛蒙上一样,虽说你也能够骑,但是内心立马就变得非常忐忑了!
我说了这么多,就是想说如果你对JVM内部的内存结构、工作机制等都完全不了解,那么这是相当有问题的,而且还是一个很大的问题。因此,你必须想方设法地去了解、搞懂JVM内部的内存结构、工作机制,因为这是你设计高扩展性应用和诊断运行时问题的基石,也是你作为一个Java工程师进阶时的必备能力!
以上就是我围绕为什么要学习JVM这个问题向大家阐述的一些我个人的看法!