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

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


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

计算机系统体系对我们来说越来越远,在不了解底层实现方式的前提下,通过高级语言很容易编写程序代码。但事实上计算机并不认识高级语言(对于计算机而言无论是什么语言都需要转换成计算机认可的汇编语言,故他不会区分你到底是什么语言!)
知乎上有条帖子:应该如何看招聘信息,直通年薪50万+?

JDK下载地址,英文文档规范:https://docs.oracle.com/javase/specs/index.html java目前19




TIOBE语言热度排行榜:index | TIOBE - The Software Quality Company
Programming Language | 2021 | 2016 | 2011 | 2006 | 2001 | 1996 | 1991 | 1986 |
|---|---|---|---|---|---|---|---|---|
C | 1 | 2 | 2 | 2 | 1 | 1 | 1 | 1 |
Java | 2 | 1 | 1 | 1 | 3 | 26 | - | - |
Python | 3 | 5 | 6 | 8 | 27 | 19 | - | - |
C++ | 4 | 3 | 3 | 3 | 2 | 2 | 2 | 8 |
C# | 5 | 4 | 5 | 7 | 13 | - | - | - |
Visual Basic | 6 | 13 | - | - | - | - | - | - |
JavaScript | 7 | 8 | 10 | 9 | 10 | 32 | - | - |
PHP | 8 | 6 | 4 | 4 | 11 | - | - | - |
SQL | 9 | - | - | - | - | - | - | - |
R | 10 | 17 | 31 | - | - | - | - | - |
Lisp | 34 | 27 | 13 | 14 | 17 | 7 | 4 | 2 |
Ada | 36 | 28 | 17 | 16 | 20 | 8 | 5 | 3 |
(Visual) Basic | - | - | 7 | 6 | 4 | 3 | 3 | 5 |
2023年流行语言排行榜:

世界上没有最好的编程语言,只有最适用于具体应用场景的编程语言
JVM:跨语言的平台
Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大Java 也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。
JAVA的跨平台性

一处编译,到处运行;
每个语言都需要转换成字节码文件,最后转换的字节码文件都能通过Java虚拟机进行运行和处理
JVM:跨语言的平台; 不同的编程语言只要转成字节码文件都可以在字节码文件中运行;(需遵循jvm虚拟机的编码规则)

JAVA不是最强大的语言,但是JVM是最强大的虚拟机;
字节码
多语言混合编程
Java平台上的多语言混合编程正成为主流,通过特定领域的语言去解决特定领域的问题是当前软件开发应对日趋复杂的项目需求的一个方向。*各种语言之间的交互不存在任何困难,就像使用自己语言的原生API一样方便,因为它们最终都运行在一个虚拟机之上。*推动Java虚拟机从“Java语言的虚拟机”向 “多语言虚拟机”的方向发展。如何真正搞懂JVM?
Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个!
自己动手写一个Java虚拟机,难吗?
天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣

上面的书是用GO语言写的JVM虚拟机;

在JDK11之前,OracleJDK中还会存在一些OpenJDK中没有的、闭源的功能。但在JDK11中,我们可以认为OpenJDK和OracleJDK代码实质上已经完全一致的程度。
不过,主流的 JDK 8 在2019年01月之后就被宣布停止更新了。另外, JDK 11 及以后的版本也不再提供免费的长期支持(LTS),而且 JDK 15 和 JDK 16 也不是一个长期支持的版本,最新的 JDK 15 只支持 6 个月时间,到 2021 年 3 月,所以千万不要把 JDK 15 等非长期支持版本用在生产。

虚拟机
所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。
Java虚拟机
作用
特点
JVM的位置

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
}本地举例1
public static void main(String[] args) {
int i=2+3;
}执行方法编译后;


本地举例2
public static void main(String[] args) {
// int i=2+3;
int i=2;
int j=3;
int k=i+j;
}
上面经过尝试貌似没有用啊!
所以我们继续命令 javap -v 文件名.class


鄙人此处是这样理解的不足之处请指出;
总结
*由于跨平台性的设计,Java的指令都是根据栈来设计的。*不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpotVM的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?
基础栈的优点;
栈:(优点) 跨平台性,指令集小,机灵多 (缺点):执行性能比寄存器差
虚拟机的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
虚拟机的执行
虚拟机的退出
有如下的几种情况:
来一个demo理解下:
public static void main(String[] args) {
// int i=2+3;
int i=2;
int j=3;
int k=i+j;
try {
Thread.sleep(6000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("hello");
}
}jps :打印当前执行的进程;
在点击执行的过程中我们查看jps(进程);–》(切记项目在执行过程中手速得快)

可以看到我们在执行的过程中是有任务在虚拟机运行的;

执行完成就退出了 ; 我们可以理解为JVM虚拟机是在java执行的过程进行执行;执行结束之后他就会进行退出;