老王带你从0~1学Java! 、Java进阶+电商系统实战内容以及Java面试题分享。无论你将来从事后端开发,还是从事大数据,亦或人工智能任一方向,Java基础一定要掌握好!
Java虚拟机可以看做是运行在操作系统之上的一个普通应用而已!
1、从硬件视角看JVM内存模型
1.1 硬盘
硬盘主要存储Java应用三部分内容:Java源码文件(.java)、字节码文件(.class)、JRE环境。当Java应用运行时,会单独生产一个自己的JRE内存实例,起到了多个Java进程间的隔离作用。
1.2 内存
在内存中,常用操作系统进程的内存模型也有栈和堆概念,比如Linux的用户态堆栈和系统堆栈,Windows操作系统的堆栈。
那Java的“一次编译、到处运行”是由谁来负责实现的呢?——JVM
为了适配不同操作系统及硬件的使用规范,JVM基于操作系统之上建立了自己的内存模型。比如适配不同位数的操作系统(32或64)、适配不同CPU处理器等等。在应用启动的过程中,会在操作系统堆的基础上开辟出一块空间,来完成JVM七大模块内存划分。
JVM内存模型七大部分包含:Java堆、Java栈、永久区(JDK>=8.x)、PC计数器、执行引擎、本地接口和本地库。
这七大部分覆盖了Java源代码从加载、验证、准备、解析、初始化、使用及卸载的整个生命周期。
JVM各模块功能如下,
1.3 CPU
我们知道,CPU在整个硬件层面属于调度者和执行者的角色,也就是常说的”中央处理器“。那在Java应用运行过程中,CPU主要完成取指令、指令译码、执行指令、访存取数和结果写回这五部分(对于其他编程语言也适用)。
所以说,CPU是硬件和内存交互的桥梁。
2、 从JVM源码目录结构看解析流程
如何阅读JVM 源码,JDK中JVM本身并不开源,只能找来openJDK来看(和JDK相似度很高),有兴趣的自己可以去官网下载源码,不同版本目录结构会稍有差异,但功能模块基本是一致的。
Open JDK目录结构,
2.1 HotSpot目录结构
代码实现部分主要为C++语言,并伴有少量C语言和汇编语言。hotspot下包含四个子目录:agent、make、src和test。
make: 包含编译HotSpot的Makefile文件。
agent: 该目录主要实现SA。
test: 包含了Java实现的一些测试类。
src: 该目录主要由cpu、os、os_cpu和share组成。
1)cpu目录下是一些依赖具体CPU处理器架构的代码,比如Sparc、x86和Zero三种计算机体系结构;
2)os目录下则是一些依赖操作系统的代码,比如Linux、Windows、Solaris和Posix;
3)os_spu则是一些同时依赖cpu和操作系统的代码,比如Linux+x86和Windows+x86等;
4)share部分是独立于操作系统和处理器的代码,也是hotspot的核心功能。
2.2 src下share目录结构
2.2.1 tools目录
tools目录下,主要包含的几个程序是独立于虚拟机的工具类程序。
- hsdis
hsdis是一个Sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件。它的作用是让HotSpot的-XX : +PrintAssembly指令调用他来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就可以通过输出的代码来分析问题。
- IdealGraphVisualizer
IdealGraphVisualizer是C2的中间表示的可视化工具,它可以帮助理解C2理想图的构造过程, 日常用于分析编译代码过程。
3)sun.misc.Launcher类是java的入口,在启动java应用的时候会首先创建Launcher类,创建Launcher类的时候回准备应用程序运行中需要的类加载器。
4)LogCompilation
LogCompilation可以输出JIT的编译日志。使用指令 -XX:+LogCompilation。
- ProjectCreator
ProjectCreator主要用于生成Visual Studio工程。
2.2.3 vm目录
主要目录作用说明。
1)prims模块里面定义的就是一些外部接口,供JDK或者其他应用程序调用。
2)servies和runtime公共模块,主要为虚拟机提供重要的基础作用。
3)Oop构成了hotspot内部的面向对象表示系统。
4)classfile提供了类的一些列解析功能。
5)memory模块提供了内存管理功能,jvm内存模型的实现就是在memory目录下。
6)gc就不用多说了,主要与垃圾收集器有关系。
7)Interpreter、C1和code等模块,主要与解释器个编译器的实现有关。
总结:通过上述硬件和代码结构两个层面,我们大致了解了JVM的内存模型以及内存模型实现前后所依赖的一系列软硬件相关适配功能。JVM看似内部实现复杂,实际上可以把它看做是一个跑着操作系统上的普通应用。另外,如果想去更深入了解JVM内存模型内部实现机制,可以进一步看memory的实现机制。