架构师视角:对JVM架构进行解析

每个Java 开发人员都知道字节码由JRE (Java运行时环境)执行。但许多人不知道JRE是Java虚拟机(JVM)的实现, 它负责分析字节码、解析并执行代码。做为一个开发人员了解JVM架构是很是重要的,由于它使咱们能更高效的编写代码。在这篇文章中咱们将更深刻了解Java中的JVM架构以及JVM的各个组件。程序员

JVM是什么?算法

虚拟机 是物理机器的一个软件实现。Java运行在VM上,实现WORA (一处编写,到处运行)。 编译器将Java文件编译成Java .class 文件,而后这个.class文件被输入到JVM中进行类文件的加载和执行。下面是一个JVM的架构图。数据库

JVM是如何工做的呢?数组

正如上面的架构图所示,JVM被分为三个主要的子系统:安全

类加载器子系统架构

运行时数据区并发

执行引擎框架

1. 类加载器子系统分布式

Java的动态类加载功能是由类加载器子系统处理。当它在运行时(不是编译时)首次引用一个类时,它加载、连接并初始化该类文件。函数

1.1 加载

类由此组件加载。启动类加载器 (Boot Strap class Loader)、扩展类加载器(Extension class Loader)和应用程序类加载器(Application class Loader) 这三种类加载器帮助完成类的加载。

启动类加载器 – 负责从启动类路径中加载类,无非就是rt.jar。这个加载器会被赋予最高优先级。

扩展类加载器 – 负责加载ext 目录(jre\lib)内的类.

应用程序类加载器 – 负责加载应用程序级别类路径,涉及到路径的环境变量等etc.

上述的类加载器会遵循委托层次算法(Delegation Hierarchy Algorithm)加载类文件。

1.2 连接

校验 – 字节码校验器会校验生成的字节码是否正确,若是校验失败,咱们会获得校验错误。

准备 – 分配内存并初始化默认值给全部的静态变量。

解析 – 全部符号内存引用被方法区(Method Area)的原始引用所替代。

1.3 初始化

这是类加载的最后阶段,这里全部的静态变量会被赋初始值, 而且静态块将被执行。

2. 运行时数据区(Runtime Data Area)

运行时数据区域被划分为5个主要组件:

方法区(Method Area) – 全部类级别数据将被存储在这里,包括静态变量。每一个JVM只有一个方法区,它是一个共享的资源。

堆区(Heap Area)– 全部的对象和它们相应的实例变量以及数组将被存储在这里。每一个JVM一样只有一个堆区。因为方法区和堆区的内存由多个线程共享,因此存储的数据不是线程安全的。

栈区(Stack Area)– 对每一个线程会单首创建一个运行时栈。对每一个函数呼叫会在栈内存生成一个栈帧(Stack Frame)。全部的局部变量将在栈内存中建立。栈区是线程安全的,由于它不是一个共享资源。栈帧被分为三个子实体:

1.局部变量数组– 包含多少个与方法相关的局部变量而且相应的值将被存储在这里。

2.操做数栈– 若是须要执行任何中间操做,操做数栈做为运行时工做区去执行指令。

3.帧数据– 方法的全部符号都保存在这里。在任意异常的状况下,catch块的信息将会被保存在帧数据里面。

4.PC寄存器– 每一个线程都有一个单独的PC寄存器来保存当前执行指令的地址,一旦该指令被执行,pc寄存器会被更新至下条指令的地址。

5.本地方法栈– 本地方法栈保存本地方法信息。对每个线程,将建立一个单独的本地方法栈。

3. 执行引擎

分配给运行时数据区的字节码将由执行引擎执行。执行引擎读取字节码并逐段执行。

解释器– 解释器能快速的解释字节码,但执行却很慢。 解释器的缺点就是,当一个方法被调用屡次,每次都须要从新解释。

JIT 编译器– JIT编译器消除了解释器的缺点。执行引擎利用解释器转换字节码,但若是是重复的代码则使用JIT编译器将所有字节码编译成本机代码。本机代码将直接用于重复的方法调用,这提升了系统的性能。

1.中间代码生成器– 生成中间代码

2.代码优化器– 负责优化上面生成的中间代码

3.目标代码生成器 – 负责生成机器代码或本机代码

4.探测器(Profiler) – 一个特殊的组件,负责寻找被屡次调用的方法。

3.垃圾回收器: 收集并删除未引用的对象。能够经过调用"System.gc()"来触发垃圾回收,但并不保证会确实进行垃圾回收。JVM的垃圾回收只收集哪些由new关键字建立的对象。因此,若是不是用new建立的对象,你可使用finalize函数来执行清理。

如何才能成为一个公司的顶梁柱般架构师呢?

基本知识

1.学会分析源码

程序员天天都和代码打交道。通过数年的基础教育和职业培训,大部分程序员都会「写」代码,或者至少会抄代码和改代码。可是,会读代码的并不在多数,会读代码又真正读懂一些大项目的源码的,少之又少。这种怪状,真要追究起来,怪不得程序员这个群体自己 —— 它是两个缘由形成的:

咱们全部的教育和培训都在强调怎么写代码,并无教你们如何读代码

大多数工做场景都是一个萝卜一个坑,咱们只须要了解一个系统的局部便能开展工做,读不相干的代码,彷佛没用

读源码三问:“为何要有这样的架构”,“他是什么样子的”,“他是怎么工做的”。

那么阿里程序员是如何去读代码的呢?

2.分布式架构特色及设计理念

首先须要说明的是,分布式系统是一个复杂且宽泛的研究领域,学习一两门在线课程,看一两本书可能都是不能彻底覆盖其全部内容的。介于这篇文章是引导初学者入门,因此我我的以为为初学者介绍一下当前分布式系统领域的全貌,也许比直接推荐论文和课程更有帮助。当初学者对这个领域创建起一个大的 Picture 以后,能够根据本身的兴趣,有选择性的深刻不一样领域进行进一步的学习。

3.为何微服务会这么火?

要学习微服务,首先,咱们要了解为何使用微服务。

代码难以理解?

构建和部署耗时长,难以定位问题,开发效率低?

单体只能按总体横向扩展,没法分模块垂直扩展?

一个bug有可能引发整个应用的崩溃?

受技术栈限制,团队成员使用同一框架和语言?

那么如何解决单体的不足呢,经过迁移到微服务架构来解决,咱们看一下什么是微服务。

微服务架构:将单体应用拆分为多个高内聚低耦合的小型服务,每一个小服务运行在独立进程,由不一样的团队开发和维护,服务间采用轻量级通讯机制,独立自动部署,能够采用不一样的语言及存储。

单体架构整个团队维护开发一个大工程及一个单库,到了微服务架构,用户请求通过API Gateway被路由到下游服务,服务之间以轻量级通讯协议进行通讯,服务经过注册中心发现彼此,每一个服务都有专门的开发维护团队,每一个服务对应独立的数据库,服务独立开发,独立部署和上线。

接下来咱们总结下微服务的优势。

易于开发与维护

微服务相对小,易于理解

启动时间短,开发效率高

独立部署

一个微服务的修改不须要协调其它服务

伸缩性强

每一个服务均可以在横向和纵向上扩展

每一个服务均可按硬件资源的需求进行独立扩容

与组织结构相匹配

微服务架构能够更好将架构和组织相匹配

每一个团队独立负责某些服务,得到更高的生产力

技术异构性

使用最适合该服务的技术

下降尝试新技术的成本

下面就送上学习架构图吧

若是你以为想提高下本身,学习文章中的知识,在此推荐一个免费公开课的地方,能够加群:433540541,找群主获取上课资格,这是免费的课程,找群主要的时候能够客气一点。

4.程序员到底要不要学习JVM

总有人问这个东西好像用不上,因而要不要学这样的问题。

而后又总有人担忧一直搬砖整天作些重复没提高的东西。

若是你这辈子只甘心作一个平庸的Java码农,那么你彻底没有必要去学习JVM相关的知识,学习JVM对于一个Java程序员的好处大概能够归纳为下几点:

1.你可以明白为何Java最先期被称为解释型语言,然后来为何又被你们叫作解释与编译并存的语言(了解JVM中解释器以及即时编译器就能够回答这个问题);

2.你可以理解动态编译与静态编译的区别,以及动态编译相对于静态编译到底有什么好处(JVM JIT);

3.你可以利用一些工具,jmap, jvisualvm, jstat, jconsole等工具能够辅助你观察Java应用在运行时堆的布局状况,由此你能够经过调整JVM相关参数提升Java应用的性能;

4.能够清楚知道Java程序是如何执行的;

5.能够明白为何Java等高级语言具备可移植性强的特性。

其实这个问题至关于“为何C/C++程序员须要学体系结构与编译原理?”

话很少说,附上学习体系图

5.被咱们忽略掉的工程化专题

IT产业行业细分化已经不是一天两天的事了。集成技术这件事并不可耻好笑,反而是另外一种难得的能力。并非像一些人形容的那样,好像批发几个CPU,拿到华强北就能把本身的电脑改装成超级计算机了。

那么,为何咱们经常会忽略掉工程化这件事的价值呢?主要的缘由,或许是由于工程化这件事自己就离咱们太远。一个产业工程化的广泛性越高,说明这个产业发展的越成熟:产业链细分、分工细化、全球化的研发和生产这些高效的工做方式开始出现。而产业成熟也每每表明着寡头化状况显著。

在IT产业中,寡头化出现表明着创业公司减小——没人再去用声势浩大的发布会讲故事、没人再去宣传本身拿了多少融资。

这一代中国人自小的教育不比欧美的STEAM,而是重学术、轻手艺。咱们每每会为工科和产能过剩画上等号。强大的资本和技术门槛为这些产业蒙上了一层神秘的面纱,让普通人很难真正了解到其中技术和工艺的复杂程度,也就更难明白其中的价值。可正是由于中国的工程化能力,才让咱们有机会走到AI时代的第一梯队,而不只仅是靠学术研究能力。

另一个缘由,或许在于咱们天生“叛逆心”。超级计算机、手机芯片等等技术门槛较高的产业,其背后每每是大企业和国资科研机构。当评判的对象是他们时,咱们彷佛更愿意相信狗血的商业故事和阴谋论:好比科研经费都被教授们吃吃喝喝啦;搞超级计算机就是放卫星其实美日根本不care啦;XX企业的技术都是从创业公司买来的除了会赚用户的钱啥技术都没有……

产生这种“叛逆心”的缘由太深入,咱们能作到的,只有在这种“惯性思惟”出现时先按住本身奔向键盘的手,转表达欲为好奇心,完成本身了解的义务,再去行使本身批判的权利。

附上思惟脑图

6.没有高并发经验,想进大公司该怎么办?

假如没有靠谱的公司,接触不到高并发的业务场景怎么办?你永远解决的是小问题,工做10年技术也未必提高多少。

不少程序员也常常找我说,没有经验就没有靠谱的公司收,没有靠谱的公司也就没有经验,我看了无数的书,本身作了无数的实验拼命想找个靠谱公司去深刻,可是感受好难,简直是个死循环

读者群的朋友你们都比较关注高并发,缘由很简单,想去BAT这样的大公司,你必需要有高并发的经验。今天普及下高并发的知识,但愿你们对高并发有一个正确的认识。

7.学习千遍,不如项目实战成功一次

咱们在学习过程当中最容易犯的一个错误就是:看的多,动手的少。特别是对一些项目的总体开发,咱们接触的机会就更少了。

一次完整的开发,是最好的学习。它能让你对整个开发流程有完整的认识,对知识也会有极大的巩固。更重要的是,你将学会将理论知识用到实际开发中的方法。

因此不管项目大小,必定要动手去进行开发学习。

项目实战相信不少程序员都多少会有的,但是咱们这个还要学习什么呢?

那就要看你想不想成为一个架构师了,为何98%的程序员工做10年,一生还只是一个开发者。程序员们都要想想这个问题,我是否是须要提高了。

我认为,学习项目实战最重要的仍是学习项目管理,做为程序员,都应该学点项目管理。

凡事皆为“项目”

项目的两类属性(复杂的逻辑,庞大的信息量)

人脑擅长的是思考,而不是记忆

成为一个“独当一面”的人

独当一面是一个很性感的词。是否拥有它,对应的职场价值,有着天壤之别的。

全部老板都喜欢“独当一面”的员工,由于这是最省心力、最好算帐的模式:给你一块资源,给你一个 title,给你一个目标,而后你给我打出一片天地来。

当你能独立对一摊子事情负责,并把它们一一搞定,你会拥有大幅度的职场溢价——相应的,其收入回报,也远非“技术螺丝”可比了。

若是你很进取,你会逐渐地:主导一个小组,一个部门,一个家庭,甚至仍是城市……而这全部的一切起点,正是独立完整地作好一个项目:你没有谁能够依靠,你要对其中大大小小的事务负责,你要对最后的结果。

换句话说,“项目管理”是“独当一面”的元能力。在这个过程当中,你的意识愈加清晰,你的方法论愈加成熟,你的信心更加沛,项目越作越大。直到某天,你真的有了掌控一方的封疆大吏。

这就是咱们学习“项目实战”的终极意义。

或许做为程序员的你想提高本身,却找不到突破口,公司没人带。又或许你已经工做6年了,却仍是很迷茫,不少知识都仍是不懂,也没有达到本身指望的一个职位,薪资。在此推荐一个免费公开课的地方,上面所提到的架构师基本知识点都有资料,能够加群:617434785,找群主获取上课资格,这是免费的课程,找群主要的时候能够客气一点。

到这里,你可能认为文章已经完了,学完这些就能够去BAT大公司作一个架构师,年薪50W+吗?

不,你错了,这些都知识最基本的知识,想要成为一个架构师必须是一个累积的过程,也是这么多程序员终其一辈子也只是一个开发,到年龄就会被公司辞退。

相关文章
相关标签/搜索