节:如何看待Java上层技术与JVM?

Posted 李阿昀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了节:如何看待Java上层技术与JVM?相关的知识,希望对你有一定的参考价值。

「JVM与Java体系架构」章节的整体目录

从现在开始我们就要正式步入第一章——JVM和Java体系结构的学习中了,首先我们看一下这一章要讲授的主要内容都有哪些。

  1. 前言
  2. 面向人群及参考书目
  3. Java及JVM简介
  4. Java发展的重大事件
  5. 虚拟机与Java虚拟机
  6. JVM的整体结构
  7. Java代码执行流程
  8. JVM的架构模型
  9. JVM的生命周期
  10. JVM的发展历程

从上面可以看到,这一章节的内容分量还是比较充足的,而且也比较详细,因为我一共罗列出来了10个点,下面我会挑选几个点来做一下简要说明。

首先,来看一下第四点,即Java发展的重大事件,相信正在看我这套JVM系列教程的童鞋,大部分都已经在做Java开发了,关于Java发展的重大事件,肯定是有所耳闻,只是可能记不得其中一些重大事件了,记不得也没关系啊,因为后续我就会给大家讲解到,只是我主要是侧重于JVM的一些变化来讲的,这其中当然还包括垃圾回收器了,乃至于Oracle公司(或者Sun公司,Oralce已经收购Sun了)一直到发布JDK 17这一整个过程当中的一些重大事件,我也会给大家一一介绍到。

然后,再来看一下第六点,即JVM的整体结构,看过上一讲的童鞋,应该都知道我们可以整个把JVM分成三层吧!而且,这三层将贯穿于大家学习内存与垃圾回收这一篇章的整个过程当中。

接着,再来看一下第七点,即Java代码执行流程,相信大家应该对其并不陌生,大家回想一下,你平时是不是这样做的,就是要么写完Java程序以后,直接部署到服务器中,然后通过前端的请求去访问,要么写一个普通的Java程序,直接点击右键运行(即Run as Java Application)。

那么,在这一整个过程当中,你有没有思考过这样一个问题,就是Java程序代码是如何从源文件到字节码文件的,中间经历过什么,又或者从字节码文件到解释运行,中间又经历过什么,我相信绝大部分Java程序员对此是不太了解的,如果你没有学习过JVM的话。当然,不排除有科班出身的童鞋知道啊,因为他们本身以前就学过C语言等高级语言,甚至汇编语言也学过,所以他们应该是清楚其中大部分过程的,毕竟语言很多都是类似的!

总之,如果你要是清楚其中的过程的话,那么就当作是复习就可以了,如果要是一点都不清楚,或者印象比较模糊,那么就得好好学了,也即彻底搞懂Java代码执行流程。

紧接着,再来看一下第八点,即JVM的架构模型,典型的虚拟机的架构模型可以分为两种,一种是基于栈的架构模型,即指令级的架构,一种是基于寄存器的架构模型,JVM在这里选择了使用基于栈的架构模型。

看到这里,难道大家心里就没有一点疑惑吗?反正我是有的,我的疑惑是基于栈的架构模型与基于寄存器的架构模型它俩之间有什么区别,以及它俩各自的优缺点又是什么。如果大家想知道问题的答案的话,那么就请拭目以待吧!

再接着,来看一下第九点,即JVM的生命周期,这是一个非常基本的问题,因为凡是内存层面的东西都是有其生命周期的,当然,不止内存层面,我们说的更宽泛一点,物理层面的东西也是有其生命周期的,比如一个可看得见摸得着的内存,它的生命周期就是从它出生开始,也就是被制造出来,一直到其死亡,死亡就是你把它给弄坏了,它自然就死亡了。如果你要是小心一点的话,那么它的生命周期可能还会再长一些。

那么,在内存层面,JVM是什么时候出生的,然后执行又是什么时候开始的,哪些情况会导致它的死亡,这都是我们要考虑的问题,因为这就是JVM一个完整的生命周期。

最后,来看一下第十点,即JVM的发展历程,既然这一点的主题是JVM的发展历程,那么我们必然会讨论到这些问题,即在JVM的整个迭代过程当中第一个JVM是什么、目前主流用的是什么JVM,以及未来还有哪些JVM正在发展的过程当中。

以上就是第一章——JVM和Java体系结构的一个整体目录,也即这一章要讲授的主要内容,这里我仅仅只是稍微简单说明了一下,后续我会针对每一个点进行详细扩展,大家就请拭目以待吧!

接下来,我就要针对前言这一点来给大家进行详细讲解了。

前言

很多Java程序员在学习JVM的时候,除了看书之外,好像就只能从网上搜相关博客来看了,但是这些博客一来是准确率比较差,有些博客在讲解JVM这方面上真是一言难尽,讲的错不说,很多就是信口开河,乱说一通;二来是没有形成一个完整的体系。正是基于此,我才决定推出这套JVM系列教程,以改变这一现象,以飨读者!套用一个比较流行的网络语,就是今天,他来了!

好像这么说,似乎这套JVM系列教程就很经典似的,不一定啊,因为经典是需要经过时间的迭代洗刷以后才能够凸显出来的。我只能这样说,就是这套JVM系列教程会尽可能地给大家展现JVM的全貌,同时,我还会尽量使用更通俗易懂一些的语言来为大家进行讲解,不让大家觉得太枯燥乏味。

你是否也遇到过这些问题?

首先,我们来看这样一个问题,就是作为Java工程师的你是不是曾被JVM伤害过?有的童鞋说有,有的童鞋说没有,说没有的童鞋,我是应该恭喜你呢,还是应该替你感觉到惋惜呢?我想应该都有啊。

然后,我们再来看一下大家在实际开发当中是不是遇到过如下这几个具体的问题。

  • 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM(即Out Of Memory,内存溢出),而且还不清楚是什么原因造成的。

  • 想解决线上JVM GC问题,也即垃圾回收器问题,但却无从下手。为什么无从下手呢?因为不知道怎么去看那些日志。

  • 新项目上线,对各种JVM参数设置一脸茫然,既然一脸茫然,那干脆就直接默认吧,结果却JJ了。或者,压根就不知道该如何进行JVM参数的调优。

  • 每次面试之前都需要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何进行JVM参数的调优,如何解决GC、OOM等问题,结果你却一脸懵逼。

    因为在实际开发过程中,我们通常面对的是具体的场景,而这是需要看我们的实操能力的。大家每次面试之前需要重背的都是JVM的一些原理概念性的东西,由于没有实操过,所以这些原理概念性的东西就会很快被遗忘掉,而这也就意味着,只有通过实操我们才能更加深刻地理解并记住这些原理概念性的东西。一句话,就是理论源于实践,又用来指导实践

    因此,最终我们还是要将关注点放在具体在实际操作中该怎样去落实上,也即如何进行JVM参数的调优,如何解决GC、OOM等问题,而这些问题的答案得等到大家学到性能监控与调优这一篇章时才能知道,因为在这一篇章中,我就会给大家详细讲解到。

下面,我们来看一下如下这样一张图,想必很多做过Java开发的人对这张图应该感到并不陌生。

从上图中可以看到,在Java相关API的上层我们构建出了不同的框架,这里我只是列举出来了其中几个而已,相信大家对此应该感到并不陌生,还记得很久以前我们在开发中使用的SSH框架吧,只不过后来我们又改成使用SSM框架了,而现在普遍采用的又都是微服务架构了。

然后,基于这些框架,我们再去写具体的应用程序,当然,写出来的应用程序最终还是要运行在JVM上的。

现在,Java早已经在企业级领域、互联网领域、移动领域,以及中间件领域,甚至是在游戏领域都发展的如火如荼,而这一切都离不开Java的运行支撑系统,也即我们常常所说的Java虚拟机。

但是,大部分Java开发人员,除了会在项目中使用到与Java平台相关的各种高精尖技术之外,对于Java技术的核心(即Java虚拟机)是了解甚少的,而且我相信这是能够引起大家的共鸣的,其实,这也符合人的认知,没什么好责备的。

举个例子来说,大家高考考完,九月份去大学报到时,家里人应该都会给你买一台新的电脑,拥有一台属于自己的电脑内心是不是非常激动啊,高兴劲过了之后也就那么一回事了。有了电脑之后,未来一段时间你会干什么事呢?首先肯定就是开机之后安装一些软件了,然后是不是还得去学习如何使用一些办公类软件啊,例如Word、PPT等,从这个层面来说,这有点类似于Java开发人员基于一些框架去开发一些应用程序了。

如果有一天,你发现电脑的内存不够用了,一般来说现在的电脑标配都是8G内存,那么该怎么办呢?是不是就得考虑加内存条啊!这时,你就需要拆开电脑的后盖,好好研究一下其内部构造了,至少得知道哪儿是CPU,哪儿是硬盘,然后找到插内存条的位置将内存条插进去就可以了,不知不觉你会发现你开始研究起电脑硬件层面上的东西了,从这个层面来说,这有点类似于Java开发人员基于框架开发完应用程序之后,开始去研究底层的JVM了。

如果这个例子不形象的话,那我再举一个例子。大家读书时离家近的是不是一般都会骑自行车上下学啊,刚开始大家肯定不会骑自行车,不会骑那就需要学了,学起来还是很简单的,学会骑自行车之后,发现别人两手不放在车把上也能骑,然后就开始羡慕,自己也开始有样学样,觉得要是也学会这样骑了,那我就是这条街上最靓的仔了!其实,这有点类似于Java开发人员基于有了Java语言之后,开始学上层的一些高级框架来解决项目实际开发过程中的一些具体问题。

但是,有一天,自行车突然坏了,自行车坏了的话,要么你去找修自行车的店铺来帮你修,要么你自己修,可要是自己修的话,那就得自己去开始研究自行车的内部原理了,搞清楚自行车到底是哪儿坏了,比如有可能是一个具体的螺丝的问题,找到问题之后立马就解决掉它。从这个层面来说,这就有点偏向于JVM的底层了。

然而,问题也就在此时发生,由于技术迭代速度很快,层出不穷,你会发现很多的程序员在上层高级框架这块就已经耗费了自己绝大部分的精力,具体点说就是要不断去学习使用新出来的一些框架,比如前几年出现的微服务框架,好在现在Java的整个体系的技术还是比较规范、稳定的,不像前一两年的大数据一样,大量的新技术不断迭代涌现出来。

另外,面对纷繁复杂的项目业务,程序员又会陷入到具体的业务逻辑当中,陷进去之后,导致始终没有更多的精力来抬一抬头去看一眼JVM。就像上面我说的第一个例子一样,你始终是在电脑的软件层面上去做操作,如果电脑内存不够用了,那么你可能就会直接换一台电脑,如果自行车坏了,你也不会去研究怎么修,而是直接再买一辆新的自行车。这可不可以呢?当然可以,因为解决问题的方式有很多种,这也不失为一种解决问题的方式。但是,这不代表不要去了解JVM,相反了解JVM对我们来说是很有必要的。

开发人员如何看待上层框架?

一些有一定工作经验的开发人员,打心眼儿里觉得SSM、微服务等上层技术才是重点,基础技术并不重要,但在我看来,这其实是一种本末倒置的“病态”,不知你是否有同感,就是首先你得认可这个事实,如果你觉得这压根不是一种本末倒置的“病态”,那么你就可以直接关掉网页,不必看我这套JVM系列教程了,然后继续去研究你觉得是上层的技术就行。你只有认可了这是一种本末倒置的“病态”,我才能给你讲接下来的内容,否则就没法讲了。

这就跟你去医院看病一样,你找到医生,然后医生问你哪里不舒服,你却说自己没病,估计医生内心是一顿卧槽,心想这不是神经病吗?病得不轻啊,得赶紧去精神病院治疗!

可以这样说,如果我们把核心类库的API比作数学公式的话,那么Java虚拟机的知识就好比公式的推导过程。

解释得形象一点,就是Java虚拟机的知识相当于是武侠小说里面男主人公修炼的内功,大家应该看过金庸的小说吧,就拿笑傲江湖这部小说来说,男主人公——令狐冲因机缘巧合练就了独孤九剑,独孤九剑几乎可以说是这部小说里面的顶级武功了,然而你要是自身的内功修炼不够的话,使用独孤九剑与敌人对抗的时候,其实也撑不了几个回合;还有金庸的另外一部小说,即倚天屠龙记,里面男主人公——张无忌练的九阳神功也是顶级内功,这里所说的内功其实大家就可以理解成是Java虚拟机的知识。

我再举一个例子,最近几年,大家也看到了人工智能发展得越来越如火如荼,所以就导致有很多人,包括一些行业外的小白,都想进入人工智能领域分一杯羹,人工智能听起来多高大上啊,肯定是前途无限,得赶紧上车,我猜他们这些人就是这样想的。

谈起人工智能,那就不得不说一下CNN了,即卷积神经网络,大家可以用它去做什么呢?这里我就直接说了,可以使用CNN(即卷积神经网络)去做实现图片识别的功能,比如看到一张服饰类图片之后,想分类它到底是属于裤子,还是衬衣,还是短袖,还是短裤,在这种场景下我们就可以使用CNN(即卷积神经网络)去做一个简单的分类了。

如果用代码实现的话,那么可以负责任地说将不会超过十行代码,大家就可以做到这个事情。但是,问题也随之相应出现了,因为这十行代码当中涉及到了一些方法参数的填写,你不知道为什么要填这个参数,而不去填另外一个参数,以及每一个参数是什么意思,又或者不同参数之间有什么区别,很明显,这都是些偏向底层的问题。大家如果仅仅只是想知道如何用,那么去学习那些上层框架就够了,这一点问题都没有,但是这样的话,即仅仅只是会写几行代码,在公司里面其实你是开不到高工资的。

但如果你想更深入底层,想去弄明白那些能够真正产生价值的东东,那么你就得花费大量的时间和精力来提升自己了,首先一点就是你得提升学历,怎么着你也得是个硕士学历吧!为什么说学历很重要啊,因为现在那些在做人工智能的企业招聘的人其实相对来讲学历都是比较高的,硕士比较普遍,博士也有,但基本看不到本科学历的,这可能是由于高学历的人经历过一个比较扎实的数理培训吧!

要想使用不超过十行的代码来实现使用CNN(即卷积神经网络)做一个简单的分类的需求,最起码你得学过线性代数、概率论与数理统计以及统计学这几门课,因为这不超过十行代码的诞生,你得用到线性代数这门课中的矩阵、概率论与数理统计这门课中的各种各样的概率分布和其特征值,以及统计学这门课中的时间序列分析与线性回归等基本知识。这些基本知识都掌握了以后,你才能够去学高大上的人工智能里面的各种知识,比如CNN(即卷积神经网络),否则就没有任何意义了。聊的稍微多了一些,还请大家耐心一点阅读😊!

最后,大家再来看一下下面这张图,从这张图中你能知晓些什么呢?

大家应该知道现在做开发,用的语言都是高级语言吧!比如就像C、C++、Java、Go等等这些。如果你要是在大学学的是计算机专业,那么你可能还会学一门语言,即汇编语言,当然,汇编语言学起来还是要比高级语言枯燥一些的。

可惜的是计算机本身其实是并不识别高级语言的,这也就是说,无论是我们写的Java程序也好,还是C程序也好,还是Go程序也好,还是Python程序也好,都得经历这样一个过程,即高级语言需要经过解释、编译等步骤形成对应的汇编语言,然后汇编语言再向下转换成0101这样的机器指令,最终才能被操作系统以及CPU识别并执行。

应该这样说,计算机系统体系对我们来说越来越遥远了,因为大家现在几乎就不怎么去关注计算机系统底层了,而是将绝大部分的精力花费在了高级语言及其之上的一些上层框架上。这样,就算是在不了解底层实现方式的前提下,大家依旧能通过高级语言很容易地编写出程序代码来。但事实上计算机并不认识高级语言!

那么,问题来了,我们还有没有必要去了解计算机系统底层的那些知识呢?当然是有必要的,而且还是相当有必要。

如果你在大学读的是计算机专业,那么你肯定是要学计科这个专业最重要的几门课程的,比如计算机组成原理(偏硬件的)、操作系统、数据结构以及计算机网络等,你会发现这几门课是没有任何一门跟高级语言相关的,它们并不纠结于具体的语言。而这也是计科人相比培训班出来的人更专业的一个原因,因为培训班出来的人压根就不重视这些基本功,可能计算机专业必学的这几门非常重要的课连听都没听说过,基础不牢地动山摇,将来他们必定是走不长远的!希望大家能警钟长鸣!

架构师每天都在思考什么?

架构师每天都在思考些什么呢?我想思考的无非就是下面两个问题。

  • 应该如何让我的系统变得更快?
  • 如何避免系统出现瓶颈?

走出校园的童鞋刚开始工作的时候肯定是会很紧张的,或许你可能还不是很适应,因为每天等待着你的是一个个具体的企业实际问题,你得去一一解决这些问题,可能每天过得都提心吊胆,乃至惶惶不可终日,内心备受煎熬。等到你终于熬过去了,有了两三年开发经验之后,你又会感觉到些许迷茫,虽说现在公司待遇也稍微涨了一些,但是每天还是陷入到了具体的公司业务当中,似乎唯一的进步就是框架用得都比较熟练了,甚至你可能心里还会犯嘀咕,怎么之前学的一些框架没有应用在公司的项目当中呢?不禁感叹学这么多框架究竟有什么意义!

出于对外来的种种担忧,你可能就会思考这样一个问题了,即该如何去继续精进自己的技术,才能够更上一层楼,而这正是架构师要考虑的问题。那么对于拥有两三年开发经验的你来说,怎么在将来还能保持薪资不断往上涨的趋势?又或者想要保持这种趋势,应该要具备哪些技能?以及应该在哪些方向上去使劲?这些都是你要严肃思考的问题。

其实,想知道这些问题的答案是很简单的,你只需要打开一些招聘网站,例如拉钩网、Boss直聘等,在其中输入一个你想要达到的薪资范围,不管你是想达到50万也好,还是80万也好,还是百万年薪也好,看一下这样的职位所要求的技能,你心里就都一清二楚了,这样的职位应该具备哪些方面的技能,你按照这些方面去继续精进自己的技术就行了。

除此之外,就是多逛逛知乎了,而且你还可以提出你的问题,然后邀请一堆大佬来回答,毕竟知乎上就有很多大神。我记得知乎上好像就有人回答过应该如何看招聘信息,直通年薪50万+的问题,从该问题下面的回答中你就能知道年薪50万+的人应该需要具备哪些技能了,然后你对比一下你自己,看看自己能不能够达到那些要求。

如果大家真的能够做到如下这几点,那么我想年薪50万+应该是不在话下的。

  • 参与现有系统的性能优化、重构,保证平台性能和稳定性。
  • 根据具体业务场景和需求,决定技术方向,做技术选型。对一个架构师而言,这一点可以说是最基本的要求了。
  • 能够独立架构和设计海量数据下高并发分布式解决方案,满足功能和非功能需求。
  • 解决各类潜在系统风险,核心功能的架构与代码编写。
  • 分析系统瓶颈,解决各种疑难杂症,性能调优等。

说白了,要想达到年薪50万乃至更高,那就不仅仅只是要求你掌握基本的技术栈了,而是还要求你具备大流量系统的完整架构能力和解决实际问题的能力。于是,你再也不能指望系统性能的提升就单纯的靠增加物理机来实现了,因为这是一种非常笨的办法,虽然我们屡试不爽。更多的情况是在现有系统性能指标下,我们应该如何进行性能调优,以解决系统出现的瓶颈。

以上是关于节:如何看待Java上层技术与JVM?的主要内容,如果未能解决你的问题,请参考以下文章

JVM从入门到精通01

Java 线程(JVM 层面)的生命周期

深入浅出Java并发编程指南「原理分析篇」站在Linux操作系统角度去看待Java的Thread(线程)机制

为什么java不是最强的语言而JVM确可以叫做最强的虚拟机呢?

浅谈现代前端框架技术思想

从字节码层面看“HelloWorld”