赞
踩
作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题?
大部分Java开发人员,除会在项目中使用到与Java平台相关的各种高精尖技术,对于Java技术的核心Java虚拟机了解甚少。
开发人员如何看待上层框架
一些有一定工作经验的开发人员,打心眼儿里觉得SSM、微服务等上层技术才是重点,基础技术并不重要,这其实是一种本末倒置的“病态”。
如果我们把核心类库的API比做数学公式的话,那么Java虚拟机的知识就好比公式的推导过程。
计算机系统体系对我们来说越来越远,在不了解底层实现方式的前提下,通过高级语言很容易编写程序代码。但事实上计算机并不认识高级语言
我们为什么要学习JVM?
Java vs C++
垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。
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 |
世界上没有最好的编程语言,只有最适用于具体应用场景的编程语言
JVM:跨语言的平台
Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大Java 也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。
每个语言都需要转换成字节码文件,最后转换的字节码文件都能通过Java虚拟机进行运行和处理
字节码
多语言混合编程
如何真正搞懂JVM?
Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个!
自己动手写一个Java虚拟机,难吗?
天下事有难易乎?
为之,则难者亦易矣;不为,则易者亦难矣
在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 }
总结
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpotVM的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?
虚拟机的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
虚拟机的执行
虚拟机的退出
有如下的几种情况:
具体JVM的内存结构,其实取决于其实现,不同厂商的JVM,或者同一厂商发布的不同版本,都有可能存在一定差异。主要以Oracle HotSpot VM为默认虚拟机。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。