赞
踩
作为 Java 工程师的你曾被伤害过吗?你是否也遇到过这些问题?
大部分 Java 开发人员,除会在项目中使用到与 Java 平台相关的各种高精尖技术,对于 Java 技术的核心 Java 虚拟机了解甚少。
开发人员如何看待上层框架
一些有一定工作经验的开发人员,打心眼儿里觉得 SSM、微服务等上层技术才是重点,基础技术并不重要,这其实是一种本末倒置的“病态”。
如果我们把核心类库的 API 比做数学公式的话,那么 Java 虚拟机的知识就好比公式的推导过程。
计算机系统体系对我们来说越来越远,在不了解底层实现方式的前提下,通过高级语言很容易编写程序代码。但事实上计算机并不认识高级语言
我们为什么要学习 JVM?
Java vs C++
垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得 JVM 内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是 Java 工程师进阶的必备能力。
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 版权所有,并保留所有权利。