系统相关
首页 > 系统相关> > <JVM上篇:内存与垃圾回收篇>01-JVM与Java体系结构

<JVM上篇:内存与垃圾回收篇>01-JVM与Java体系结构

作者:互联网

笔记来源:尚硅谷 JVM 全套教程,百万播放,全网巅峰(宋红康详解 java 虚拟机)

文章目录

1.JVM 与 Java 体系结构

1.1. 前言

作为 Java 工程师的你曾被伤害过吗?你是否也遇到过这些问题?

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

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

一些有一定工作经验的开发人员,打心眼儿里觉得 SSM、微服务等上层技术才是重点,基础技术并不重要,这其实是一种本末倒置的“病态”。

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

image-20200704112119729

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

我们为什么要学习 JVM?

Java vs C++

image-20200704112700211

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

1.2. 面向人群及参考书目

image-20210507095948516

image-20200704145340513

image-20210507100021400

image-20210507100104455

1.3. Java 及 JVM 简介

TIOBE 语言热度排行榜:index | TIOBE - The Software Quality Company

Programming Language20212016201120062001199619911986
C12221111
Java2111326--
Python35682719--
C++43332228
C#545713---
Visual Basic613------
JavaScript781091032--
PHP864411---
SQL9-------
R101731-----
Lisp3427131417742
Ada3628171620853
(Visual) Basic--764335

世界上没有最好的编程语言,只有最适用于具体应用场景的编程语言

JVM:跨语言的平台

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

image-20200704151731216

每个语言都需要转换成字节码文件,最后转换的字节码文件都能通过 Java 虚拟机进行运行和处理

image-20200704152052489

字节码

多语言混合编程

如何真正搞懂 JVM?

Java 虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个!

自己动手写一个 Java 虚拟机,难吗?

天下事有难易乎?

为之,则难者亦易矣;不为,则易者亦难矣

image-20210507102334642

1.4. Java 发展的重大事件

image-20200704182035810

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

不过,主流的 JDK 8 在 2019 年 01 月之后就被宣布停止更新了。另外, JDK 11 及以后的版本也不再提供免费的长期支持(LTS),而且 JDK 15 和 JDK 16 也不是一个长期支持的版本,最新的 JDK 15 只支持 6 个月时间,到 2021 年 3 月,所以千万不要把 JDK 15 等非长期支持版本用在生产。

img

1.5. 虚拟机与 Java 虚拟机

虚拟机

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

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

Java 虚拟机

作用

特点

JVM 的位置

image-20200704183048061

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

1.6. JVM 的整体结构

image-20200704183436495

1.7. Java 代码执行流程

image-20200704210429535

1.8. JVM 的架构模型

Java 编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构

具体来说:这两种架构之间的区别:

基于栈式架构的特点

基于寄存器架构的特点

举例 1

同样执行 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

举例 2

public int calc(){
    int a=100;
    int b=200;
    int c=300;
    return (a + b) * c;
}
> javap -c Test.class
...
public int calc();
    Code:
    Stack=2,Locals=4,Args_size=1
       0: bipush        100
       2: istore_1
       3: sipush        200
       6: istore_2
       7: sipush        300
      10: istore_3
      11: iload_1
      12: iload_2
      13: iadd
      14: iload_3
      15: imul
      16: ireturn
}

总结

由于跨平台性的设计,Java 的指令都是根据栈来设计的。不同平台 CPU 架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令

时至今日,尽管嵌入式平台已经不是 Java 程序的主流运行平台了(准确来说应该是 HotSpotVM 的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?

1.9. JVM 的生命周期

虚拟机的启动

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

虚拟机的执行

虚拟机的退出

有如下的几种情况:

X. JVM 的发展历程

Sun Classic VM

image-20220320162135224

由图可知:使用解释器和JIT任意一个都可将字节码转为机器码.所以最初的虚拟机只有解释器,但是它的工作流程是逐行解释字节码的,对于重复性较强的代码(比如for循环等)亦是如此,即每次都执行一遍. 导致效率极低.

JIT即时编译器:在程序执行过程中如果发现一些代码被反复执行,就将其确定为热点代码.然后就会将这些热点代码解释成机器指令后缓存起来,等下次执行到热点代码时,直接从缓存中取,无需重新解释执行.可以提高程序执行效率.

那为啥不直接用JIT代替解释器呢?

因为JIT将代码编译成本地机器码也是需要时间的,如果全部都缓存,会导致程序刚开始时暂停时间过长.之后效率才会逐渐提高. 现在是混合模式,先cllient(解释)模式,再server(JIT)模式

**一句话:**JIT理解为去思考到底怎么去才快,是步行还是做车还是坐飞机,这个思考阶段才算是JIT慢的原因.而不是像解释器那样一开始就做车.

Exact VM

HotSpot VM

JRockit

IBM 的 J9

KVM 和 CDC / CLDC Hotspot

Azul VM

Liquid VM

Apache Harmony

Micorsoft JVM

Taobao JVM

Dalvik VM

Graal VM

总结

具体 JVM 的内存结构,其实取决于其实现,不同厂商的 JVM,或者同一厂商发布的不同版本,都有可能存在一定差异。主要以 Oracle HotSpot VM 为默认虚拟机。

标签:01,Java,虚拟机,VM,HotSpot,编译器,JVM
来源: https://blog.csdn.net/LXYDSF/article/details/123616877