JVM(一)JVM与Java体系结构

上篇(JVM内存与垃圾回收篇)大纲

  1. JVM与Java体系结构
  2. 类加载子系统
  3. 运行时数据区概述及线程
  4. 程序计数器
  5. 虚拟机栈
  6. 本地方法接口
  7. 本地方法栈
  8. 方法区
  9. 直接内存
  10. 执行引擎
  11. StringTable
  12. 垃圾回收概述
  13. 垃圾回收算法
  14. 垃圾回收概念
  15. 垃圾回收器

JVM与Java体系结构

目录

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

1. 前言

0.png

1.1 如何看待java上层技术与JVM

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

  • 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!
  • 想解决线上JVM问题,但却无从下手
  • 新项目上线,对各种JVM参数设置一脸茫然,直接默认吧,然后就JJ了
  • 每次面试前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优JVM参数,如何解决GC、OOM等问题,一脸懵逼。


    1.png

大部分JAVA开发人员,除会在项目中使用到JAVA平台相关的各种高精尖技术,对于JAVA技术的核心——java虚拟机,了解甚少。

开发人员如何看待框架:

  • 一些有一定工作经验的开发人员,打心眼儿里觉得SSM、微服务等上层技术才是重点,基础技术并不重要,这其实是一种本末倒置的“病态”。
  • 如果我们把核心类库的API比做数学公式的话,那么JAVA虚拟机的知识就好比公式的推导过程。


    2.png

计算机系统体系对我们来说越来越远,在不了解底层实现方式的前提下,通过高级语言很容易编写代码。但事实上计算机并不认识高级语言。

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

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

作为我们自己应该往哪里努力?打开招聘网站,看高薪招聘要求:

  • 参与现有系统的性能优化,重构,保证平台性能和稳定性;
  • 根据业务场景和需求,决定技术方向,做技术选型;
  • 能够独立架构和设计海量数据下高并发分布式解决方案,满足功能和非功能需求;
  • 解决各类潜在系统风险,核心功能架构与代码编写;
  • 分析系统瓶颈,解决各种疑难杂症,性能调优等。

1.2 我们为什么要学习JVM

  • 面试的需要,大厂都爱问
  • 中高级程序员必备技能
    如,项目管理、调优的需要
  • 追求极客的精神
    如:垃圾回收算法、JIT、底层原理

JAVA vs. C++:对于C++内存的分配和垃圾回收东需要程序员自己去操作 ,而Java的虚拟机提供了内存动态分配和垃圾收集技术。
3.png

垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。

2. 面向人群及参考书目

2.1 课程面向人群

  • 拥有一定开发经验的JAVA平台开发人员
  • 软件设计师、架构师
  • 系统调优人员
  • 有一定的java变成基础并希望有进一步理解java的程序员
  • 虚拟机爱好者,JVM实践者

2.2 参考书目

官方规范: The Java Language Specification
4.png

深入理解Java虚拟机
5.png

3. Java及JVM简介

3.1 跨平台的语言java和跨语言的平台JVM

Tiobe语言排行榜:https://www.tiobe.com/tiobe-index/
世界上没有最好的编程语言,只有最适用于具体应用场景的编程语言。

3.1.1 Java生态圈

java是目前应用最为广泛的软件开发平台之一。随着java以及java社区的不断壮大,java也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。

  • 作为一个平台,java虚拟机扮演着举足轻重的作用。
    Groovy、Scala、JRuby、Kotlin等都是java平台的一部分
  • 作为一种文化,java几乎成为了“开源”的代名词。
    第三方开源软件和框架。如Tomcat、Struts,MyBatis,Spring等。
    就连JDK和JVM自身也有不少开源的实现,如OpenJDK、Harmony。
  • 作为一个社区,java拥有全世界最多的技术拥护者和开源社区支持,有数不清的论坛和资料。从桌面应用软件、嵌入式开发到企业级应用、后天服务器、中间件、都可以看到java的身影。其应用形式之复杂、参与人数之众多也令人咂舌。
3.1.2 java:跨平台的语言
6.png

The Java Virtual Machine is the cornerstone of the Java platform. It is the component of the technology responsible for its hardware- and operating system independence, the small size of its compiled code, and its ability to protect users from malicious programs.
The Java Virtual Machine is an abstract computing machine. Like a real computing machine, it has an instruction set and manipulates various memory areas at run time.It is reasonably common to implement a programming language using a virtual machine.

Java虚拟机是Java平台的基石。它是该技术的一个组成部分,它独立于硬件和操作系统,保证编译代码的小尺寸,并且能够保护用户免受恶意程序的攻击。
Java虚拟机是一种抽象的计算机。像真正的计算机一样,它有一个指令集,并在运行时处理各种内存区域。使用虚拟机实现编程语言是相当常见的。

3.1.3 JVM:跨语言的平台
7.png

java虚拟机的起始原材料是字节码文件,而字节码文件是可以由不同编程语言提供的,只需要各种编程语言提供各自的编译器,编译成字节码文件之后遵循java虚拟机的规范,就可以让java虚拟机解释运行。
随着java7的正式发布,java虚拟机的设计者们通过JSR-292规范基本实现在\color{green}{java虚拟机平台上可以运行非java语言编写的程序}
java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它\color{green}{只关心“字节码”文件}。也就是说java虚拟机拥有语言无关性,并不会单纯地与java语言“终身绑定”,只要其他编程语言的编译结果满足并包含java虚拟机的内部指令集、符号表以及其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。
可以说,java不是最强大的语言,但是JVM是最强大的虚拟机。

3.2 字节码与多语言混合编程

3.2.1 字节码

我们平时说的java字节码,指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该同称为jvm字节码。
不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行。
java虚拟机与java语言并没有必然的练习,它只与特定的二进制文件格式——Class文件格式所关联,Class文件中包含了java虚拟机指令集(或者称为字节码、Bytecodes)和符号表,还有一些其他辅助信息。

3.2.2 多语言混合编程

java平台上的多语言混合编程正在称为主流,通过特定领域的语言去解决特定领域的问题是当前软件开发应对日趋复杂的项目需求的一个方向。
试想一下,在一个项目之中,并行处理用Clojure语言编写,展示层使用JRuby/Rails,中间层则是Java,每个应用层都将使用不同的编程语言来完成,而且,接口对每一层的开发者都是透明的,各种语言之间的交互不存在任何困难,就像使用自己语言的原生API一样方便,因为它们最终都会运行在一个虚拟机之上。
对这些运行于java虚拟机之上、java之外的语言,来自系统级的、底层的支持正在迅速增强,以JSR-292为核心的一系列项目和功能改进(如DaVinci Machine项目、Nashorn引擎、InvokeDynamic指令、java.lang.invoke包等),推动java虚拟机从“java语言的虚拟机”向“多语言虚拟机”的方向发展。

4. Java发展的重大事件

  • 1990年,在Sun计算机公司中,由Patrick Naughton、MikeSheridan及James Gosling领导的小组Green Team,开发出的新的程序语言,命名为oak,后期命名为Java
  • 1995年,Sun正式发布Java和HotJava产品,Java首次公开亮相。
  • 1996年1月23日sun Microsystems发布了JDK 1.0。
  • 1998年,JDK1.2版本发布。同时,sun发布了JSP/Servlet、EJB规范,以及将Java分成了J2EE、J2SE和J2ME。这表明了Java开始向企业、桌面应用和移动设备应用3大领域挺进。
  • 2000年,JDK1.3发布,\color{green}{Java HotSpot Virtual Machine正式发布,成为Java的默认虚拟机。}
  • 2002年,JDK1.4发布,古老的Classic虚拟机退出历史舞台。
  • 2003年年底,\color{green}{Java平台的scala正式发布,同年Groovy也加入了Java阵营。}
  • 2004年,JDK1.5发布。同时JDK1.5改名为JavaSE5.0。
  • 2006年,JDK6发布。同年,\color{green}{Java开源并建立了openJDK。顺理成章,Hotspot虚拟机也成为了openJDK中的默认虚拟机。}
  • 2007年,Java平台迎来了新伙伴Clojure。
  • 2008年,oracle收购了BEA,\color{green}{得到了JRockit虚拟机。}
  • 2009年,Twitter宣布把后台大部分程序从Ruby迁移到scala,这是Java平台的又一次大规模应用。
  • 2010年,oracle收购了sun,\color{green}{获得Java商标和最真价值的HotSpot虚拟机。}此时,oracle拥有市场占用率最高的两款虚拟机HotSpot和JRockit,并计划在未来对它们进行整合:HotRockit
  • 2011年,JDK7发布。在JDK1.7u4中,\color{green}{正式启用了新的垃圾回收器G1。}
  • 2017年,JDK9发布。\color{green}{将G1设置为默认Gc,替代CMS}
  • 同年,\color{green}{IBM的J9开源},形成了现在的open J9社区
  • 2018年,Android的Java侵权案判决,Google赔偿oracle计88亿美元
  • 同年,oracle宣告JavagE成为历史名词JDBC、JMS、Servlet赠予Eclipse基金会
  • 同年,JDK11发布,LTS版本的JDK,\color{green}{发布革命性的zGc,调整JDK授权许可}
  • 2019年,JDK12发布,加入RedHat领导开发的\color{green}{shenandoah GC}

在JDK11之前,oracleJDK中还会存在一些openJDK中没有的、闭源的功能。但在JDK11中,我们可以认为openJDK和oracleJDK代码实质上已经完全一致的程度。

5. 虚拟机与Java虚拟机

5.1 虚拟机

所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以\color{green}{分为系统虚拟机和程序虚拟机。}

  • 大名鼎鼎的Visual Box,Mware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。
  • 程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。

无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。

5.2 java虚拟机

Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。
\color{green}{Java技术的核心就是Java虚拟机}(JVM,Java Virtual Machine),因为所有的Java程序都运行在Java虚拟机内部。

  • 作用:\color{green}{Java虚拟机就是二进制字节码的运行环境},负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
  • 特点:\color{green}{一次编译,到处运行;自动内存管理;自动垃圾回收功能}

5.3 JVM的位置

8.png

JVM是运行在操作系统之上的,它与硬件没有直接的交互。

JDK的构成:
9.png

6. JVM的整体结构

  • HotSpot VM是目前市面上高性能虚拟机的代表作之一。
  • 它采用解释器与即时编译器并存的架构。
  • 在今天,Java程序的运行性能早已脱胎换骨,已经达到了可以和C/C++程序一较高下的地步。
10.png

java栈,现在又叫虚拟机栈。
多线程共享方法区和栈。
虚拟机栈、本地方法栈、程序计数器是每个线程独有一份的。
执行引擎内部分为三部分:解释器、即时编译器、垃圾回收器。用来解释执行。

7. Java代码执行流程

11.png

8. JVM的架构模型

Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。具体来说:这两种架构之间的区别:

\color{green}{基于栈式架构的特点:}

  • 设计和实现更简单,适用于资源受限的系统;
  • 避开了寄存器的分配难题:使用零地址指令方式分配。
  • 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现。
  • 不需要硬件支持,可移植性更好,更好实现跨平台。

\color{green}{基于寄存器架构的特点:}

  • 典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虚拟机。
  • 指令集架构则完全依赖硬件,可移植性差
  • 性能优秀和执行更高效
  • 花费更少的指令去完成一项操作。
  • 在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主。

举例:同样执行2+3这种逻辑操作,其指令分别如下:

基于栈的计算流程(以Java虚拟机为例):

iconst_2 //常量2入栈
istore_1
iconst_3 // 常量3入栈
istore_2
iload_1
iload_2
iadd //常量2/3出栈,执行相加
istore_0 // 结果5入栈

而基于寄存器的计算流程:

mov eax,2 //将eax寄存器的值设为1
add eax,3 //使eax寄存器的值加3

总结:
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。\color{green}{优点是跨平台,指令集小,编译器容易实现,缺点是性能下降},实现同样的功能需要更多的指令。
时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpotVM的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?——栈的设计和实现比较简单,在非资源受限的平台中也是可以用的(嵌入式平台是资源受限的),考虑到栈式的优点,也没有必要再进行更换了。

9. JVM的生命周期

JVM的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。

JVM的执行

  • 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。
  • 程序开始执行时他才运行,程序结束时他就停止。
  • 执行一个所谓的Java程序的时候,\color{green}{真真正正在执行的是一个叫做Java虚拟机的进程。}

JVM的退出

  • 程序正常执行结束
  • 程序在执行过程中遇到了异常或错误而异常终止
  • 由于操作系统用现错误而导致Java虚拟机进程终止
  • 某线程调用Runtime类或system类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
  • 除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载 Java虚拟机时,Java虚拟机的退出情况。

10. JVM的发展历程

Sun Classic VM

Exact VM

HotSpot VM

JRockit

IBM的J9

KVM和CDC / CLDC Hotspot

Azul VM

Liquid VM

Apache Marmony

Micorsoft JVM

Taobao JVM

Dalvik VM

Graal VM

Micorsoft JVM

Micorsoft JVM

Micorsoft JVM

Micorsoft JVM

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • 你是否也遇到过这些问题? 运行线上系统突然卡死,系统无法访问,甚至直接OOM 想解决线上JVM GC问题,但却无从...
    黄榕生Ron阅读 256评论 0 0
  • 1. Java及JVM简介 1.1 Java语言的跨平台特性 Java是一种跨平台的语言(write once, ...
    5c4797452c5f阅读 283评论 0 0
  • 1.为什么要学习JVM? 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM(Out...
    okhoogh阅读 256评论 0 0
  • 一些有一定工作经验的开发人员,觉得SSM,微服务等上层技术才是重点,基础技术并不重要,这是本末倒置的。 参考书目 ...
    Gason_d796阅读 269评论 0 1
  • 1、java技术体系: ①java程序设计语言 ②各种硬件平台上的java虚拟机 ③Class文件格式 ④Java...
    洛城天使阅读 136评论 0 0